Javascript TS2538型&x27;未定义';不能用作索引类型。当检查分配给变量时
我得到TS错误: TypeScript错误:“未定义”类型不能用作索引类型。TS2538 对于此简单函数(根据提供的索引从数组中获取对象):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
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]
}