代码是:
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吗?
当前回答
我找到的解决办法是
const [files, setFiles] = useState([] as any);
其他回答
我在React函数组件中得到了相同的错误,使用useState钩子。
解决方案是在初始化时使用尖括号声明useState的类型:
// Example: type of useState is an array of string
const [items , setItems] = useState<string[]>([]);
这似乎是typescript中一些奇怪的行为,因为遗留的原因而被困住了。如果你有代码:
const result = []
通常你会这样写:
const result:any[] = []
然而,如果你在你的tsconfig中同时设置了noImplicitAny FALSE和strictNullChecks TRUE,它将被视为:
const result:never[] = []
恕我直言,这种行为完全不合逻辑。打开空检查改变数组的条目类型??然后打开noImplicitAny实际上恢复使用any没有任何警告??
当你真的有一个any的数组时,你不需要用额外的代码来指明它。
从"compilerOptions"中删除"strictNullChecks": true或在tsconfig中将其设置为false。这些错误会像任何东西一样消失,你的应用程序将成功编译。
免责声明:这只是一个变通方案。此错误仅在null检查未正确处理时出现,这在任何情况下都不是完成工作的好方法。
另一种方法是:
const result: any[] = [];
你所要做的就是将结果定义为一个字符串数组,如下所示:
const result : string[] = [];
如果没有定义数组类型,默认情况下将为never。因此,当您尝试向它添加字符串时,它是类型不匹配,因此抛出您所看到的错误。