TS2538类型“未定义”不能用作索引类型。当支票分配给变量时

时间:2019-05-29 07:22:50

标签: javascript typescript

我收到TS错误:

  

TypeScript错误:类型'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] : {};
}

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

2 个答案:

答案 0 :(得分:0)

由于代码流中存在某种间接性,因此Typescript将不会按照我们的预期进行代码分析。因此,这是用户定义类型防护进入救援的地方。

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

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

由于index在getData函数中是可选的,因此它可能是undefined,因此您的第二种方法有效。

答案 1 :(得分:0)

类型保护不能与中间变量一起使用。您必须直接测试变量:

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

或者:

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

另请参阅:documentation from the handbook on type guards

注意:typeof index !== 'undefined'现在不是必需的:ES2015/2016 way of 'typeof varName === 'undefined`?