Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 之前检查的未定义值的TypeScript错误_Javascript_Typescript - Fatal编程技术网

Javascript 之前检查的未定义值的TypeScript错误

Javascript 之前检查的未定义值的TypeScript错误,javascript,typescript,Javascript,Typescript,我创建了一个函数,可以将一个项添加到数组中,也可以将一个项更新到给定的索引(如果已设置) 我正在使用打字脚本,我发现了一个我似乎无法理解的非常奇怪的行为 这是一本书 此简化函数适用于TypeScript: function OKAddOrUpdateFunction(item: string, index?: number) { const foo = index !== undefined ? Object.assign([], initialArray, { [ind

我创建了一个函数,可以将一个项添加到数组中,也可以将一个项更新到给定的索引(如果已设置)

我正在使用打字脚本,我发现了一个我似乎无法理解的非常奇怪的行为

这是一本书

此简化函数适用于TypeScript:

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 like
if(index!==undefined)
中检查未定义,在这种情况下,TS很清楚在
true
情况下,您的
索引是一个数字

因此,可能的解决办法:

  • 检查是否存在未定义的内部if语句(首选)
  • 只在确定的情况下写入[索引为编号](如果有人在if之前更改代码,TS将不会检测到错误)

typescript不能像这样“存储”类型推断,因为在中,它不记得您已将类型推断信息存储在
isIndexDefined
变量中