代码是:
const foo = (foo: string) => {
const result = []
result.push(foo)
}
我得到以下TS错误:
string类型的实参不能赋值给never类型的形参。
我做错了什么?这是一个bug吗?
代码是:
const foo = (foo: string) => {
const result = []
result.push(foo)
}
我得到以下TS错误:
string类型的实参不能赋值给never类型的形参。
我做错了什么?这是一个bug吗?
当前回答
从"compilerOptions"中删除"strictNullChecks": true或在tsconfig中将其设置为false。这些错误会像任何东西一样消失,你的应用程序将成功编译。
免责声明:这只是一个变通方案。此错误仅在null检查未正确处理时出现,这在任何情况下都不是完成工作的好方法。
其他回答
在使用ReactJS Hook时,我在ReactJS无状态函数中出现了同样的错误 useState。 我想设置一个对象数组的状态,如果我用下面的方法
const [items , setItems] = useState([]);
并像这样更新状态:
const item = { id : new Date().getTime() , text : 'New Text' };
setItems([ item , ...items ]);
我得到了错误: 类型为'{id: number;any}'不能赋值给类型为'never'的形参
但如果这样做,
const [items , setItems] = useState([{}]);
错误消失了,但有一个项目在0索引没有任何数据(不想要)。
所以我找到的解决方案是:
const [items , setItems] = useState([] as any);
从"compilerOptions"中删除"strictNullChecks": true或在tsconfig中将其设置为false。这些错误会像任何东西一样消失,你的应用程序将成功编译。
免责声明:这只是一个变通方案。此错误仅在null检查未正确处理时出现,这在任何情况下都不是完成工作的好方法。
这似乎是typescript中一些奇怪的行为,因为遗留的原因而被困住了。如果你有代码:
const result = []
通常你会这样写:
const result:any[] = []
然而,如果你在你的tsconfig中同时设置了noImplicitAny FALSE和strictNullChecks TRUE,它将被视为:
const result:never[] = []
恕我直言,这种行为完全不合逻辑。打开空检查改变数组的条目类型??然后打开noImplicitAny实际上恢复使用any没有任何警告??
当你真的有一个any的数组时,你不需要用额外的代码来指明它。
我得到的错误时定义(初始化)一个数组如下:
let mainMenu: menuObjectInterface[] | [] = [];
我得到的问题的代码:
let mainMenu: menuObjectInterface[] | [] = [];
dbresult.rows.forEach((m) => {
if (!mainMenu.find((e) => e.menucode === m.menucode)) {
// Not found in mainMenu, yet
mainMenu.push({menucode: m.menucode, menudescription: m.menudescription}) // Here the error
}
})
错误是:TS2322:类型“any”不能赋值给类型“never”
原因是数组初始化时也选择了空数组。 Typescript看到了一个push到类型,该类型也可以为空。因此出现了错误。
将行改为这样修正了错误:
let mainMenu: menuObjectInterface[] = [];
另一种方法是:
const result: any[] = [];