代码是:
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吗?
当前回答
我得到的错误时定义(初始化)一个数组如下:
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[] = [];
其他回答
你需要输入result到字符串const result的数组:string[] =[];。
这个错误还有一个原因。 如果你在使用connect()()包装组件后导出,那么props可能会给出typescript errorSolution:我没有探索太多,因为我可以选择用useSelector钩子替换连接函数 例如
/* Comp.tsx */
interface IComp {
a: number
}
const Comp = ({a}:IComp) => <div>{a}</div>
/* **
below line is culprit, you are exporting default the return
value of Connect and there is no types added to that return
value of that connect()(Comp)
** */
export default connect()(Comp)
--
/* App.tsx */
const App = () => {
/** below line gives same error
[ts] Argument of type 'number' is not assignable to
parameter of type 'never' */
return <Comp a={3} />
}
当您在没有设置对象属性的情况下设置对象中的属性值时,会发生此错误。声明带有属性的对象类型,然后在实例化对象时分配该类型。现在您可以设置属性值而不会出现此错误。
这似乎是typescript中一些奇怪的行为,因为遗留的原因而被困住了。如果你有代码:
const result = []
通常你会这样写:
const result:any[] = []
然而,如果你在你的tsconfig中同时设置了noImplicitAny FALSE和strictNullChecks TRUE,它将被视为:
const result:never[] = []
恕我直言,这种行为完全不合逻辑。打开空检查改变数组的条目类型??然后打开noImplicitAny实际上恢复使用any没有任何警告??
当你真的有一个any的数组时,你不需要用额外的代码来指明它。
你所要做的就是将结果定义为一个字符串数组,如下所示:
const result : string[] = [];
如果没有定义数组类型,默认情况下将为never。因此,当您尝试向它添加字符串时,它是类型不匹配,因此抛出您所看到的错误。