Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.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 TS2538型&x27;未定义';不能用作索引类型。当检查分配给变量时_Javascript_Typescript - Fatal编程技术网

Javascript TS2538型&x27;未定义';不能用作索引类型。当检查分配给变量时

Javascript TS2538型&x27;未定义';不能用作索引类型。当检查分配给变量时,javascript,typescript,Javascript,Typescript,我得到TS错误: TypeScript错误:“未定义”类型不能用作索引类型。TS2538 对于此简单函数(根据提供的索引从数组中获取对象): constmyarr:Array=[{name:'John'},{name:'Tom'}] 函数getData(索引?:编号){ 常量isIndex:boolean=typeof索引!=“未定义”; 返回isIndex?myArr[index]:{}; } 对我来说更神秘的是,当我将其更改为: function getData(index?: numbe

我得到TS错误:

TypeScript错误:“未定义”类型不能用作索引类型。TS2538

对于此简单函数(根据提供的索引从数组中获取对象):

constmyarr:Array=[{name:'John'},{name:'Tom'}]
函数getData(索引?:编号){
常量isIndex:boolean=typeof索引!=“未定义”;
返回isIndex?myArr[index]:{};
}
对我来说更神秘的是,当我将其更改为:

function getData(index?: number) {
    return typeof index !== 'undefined' ? myArr[index] : {};
}

每件事都很有魅力——为什么?

由于代码流中存在一些间接性,Typescript不会像我们预期的那样遵循代码分析。因此,用户定义类型的防护装置就出现在这里进行救援

function isUndefined(index: any): index is boolean {
    return typeof index === "undefined";
}

function getData(index?: number) {
    return isUndefined(index) ? myArr[index] : {};
}

因为
索引
在getData函数中是可选的,所以它可能是
未定义的
,所以第二种方法有效。

类型保护不适用于中间变量。您必须直接测试变量:

function getData(index?: number) {
  return index !== undefined ? myArr[index] : {};
}
或:

另见:


注意:
typeof索引!='未定义的“
现在不是必需的:

外推代码路径似乎有问题。在后一种情况下,很明显,如果
index
未定义的
,那么您将不会采用执行
myArr[index]
的代码路径。当您从第一个示例引入间接寻址级别时,不清楚当
索引
未定义时是否不会调用
myArr[index]
。这是代码分析的工作方式,如果进行内联检查,它可以遵循逻辑,如果将变量放入变量中,它将无法遵循逻辑。
typeof index!='这里甚至不需要未定义的“
”。变量
索引
根据定义是存在的-您需要执行
类型
检查以避免引用未定义的变量。
typeof
解决的另一个问题是
undefined
实际上不是值
undefined
。我要说的是,如果你有这个问题,那么还有更大的问题,而且
typeof
只是在治疗症状,而不是问题。顺便说一句,即使使用严格模式,你仍然可以重新定义
未定义的
。老实说,我很惊讶地发现这一点
test=undefined=>“a”==undefined
,然后尝试调用
test(“a”)
@VLAZ My bad,这是从ES2015开始的。是的,您可以命名一个参数
未定义
,但这只是一种不好的做法。API的用户无法更改未定义的
,编写强代码就足够了。
function getData(index?: number) {
  if (index === undefined)
    return {};
  return myArr[index]
}