typescript TS2538类型“undefined”不能用作索引类型,当检查分配给变量时

sulc1iza  于 2023-05-08  发布在  TypeScript
关注(0)|答案(2)|浏览(441)

我收到TS错误:
类型脚本错误:类型“undefined”不能用作索引类型。TS2538
对于这个简单的函数(根据提供的索引从数组中获取对象):

const myArr: Array<object> = [{name: 'John'}, {name: 'Tom'}]

function getData(index?: number) {
    const isIndex : boolean = typeof index !== 'undefined';

    return isIndex ? myArr[index] : {};
}

对我来说更神秘的是,当我把它改成:

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

一切都像一个魅力-为什么?

vmdwslir

vmdwslir1#

由于代码流中的间接性,Typescript将不按预期执行代码分析。这就是 * 用户定义的类型保护 * 来保存这一天的时候。

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

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

因为index在getData方法中是可选的,所以它可能是undefined,所以第二种方法是可行的。

fd3cxomn

fd3cxomn2#

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

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

或者:

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

另请参阅:类型防护装置手册中的文档。
注意:现在不需要typeof index !== 'undefined'ES2015/2016 way of 'typeof varName === 'undefined`?

相关问题