Javascript 之前检查的未定义值的TypeScript错误
我创建了一个函数,可以将一个项添加到数组中,也可以将一个项更新到给定的索引(如果已设置) 我正在使用打字脚本,我发现了一个我似乎无法理解的非常奇怪的行为 这是一本书 此简化函数适用于TypeScript:Javascript 之前检查的未定义值的TypeScript错误,javascript,typescript,Javascript,Typescript,我创建了一个函数,可以将一个项添加到数组中,也可以将一个项更新到给定的索引(如果已设置) 我正在使用打字脚本,我发现了一个我似乎无法理解的非常奇怪的行为 这是一本书 此简化函数适用于TypeScript: function OKAddOrUpdateFunction(item: string, index?: number) { const foo = index !== undefined ? Object.assign([], initialArray, { [ind
function OKAddOrUpdateFunction(item: string, index?: number) {
const foo = index !== undefined
? Object.assign([], initialArray, { [index]: item }) : [...initialArray, item];
}
现在,如果我使用常量
并存储索引
是否已定义,以便稍后使用:
function NOKAddOrUpdateFunction(item: string, index?: number) {
const isIndexDefined = index !== undefined;
const foo = isIndexDefined
? Object.assign([], initialArray, { [index]: item }) : [...initialArray, item];
}
TypeScript在指向对象内的索引时抛出错误。分配:
(parameter) index: number | undefined
A computed property name must be of type 'string', 'number', 'symbol', or 'any'.(2464)
我不明白为什么…考虑这种情况
函数NOKAddOrUpdateFunction(项:字符串,索引?:编号){
常量isIndexDefined=索引!==未定义| | true;//始终为true
常量foo=isIndexDefined
?Object.assign([],initialArray,{[index]:item}):[…initialArray,item];
}
现在,即使索引是未定义的
,已定义的
也将是真的
,因此此代码将运行对象。分配([],initialArray,{[index]:item})
,并且它将失败,因为数组的索引不能被定义。(这就是TS警告您的)
TS不能在if
语句之前对变量进行假设
在第一种情况下,您直接在if likeif(index!==undefined)
中检查未定义,在这种情况下,TS很清楚在true
情况下,您的索引是一个数字
因此,可能的解决办法:
- 检查是否存在未定义的内部if语句(首选)
- 只在确定的情况下写入[索引为编号](如果有人在if之前更改代码,TS将不会检测到错误)
typescript不能像这样“存储”类型推断,因为在中,它不记得您已将类型推断信息存储在isIndexDefined
变量中