打字稿:索引签名对象与其他类型的并集导致错误

时间:2019-07-14 04:08:03

标签: typescript

我希望能够输入 prop 作为索引签名对象或只是数字。重现此问题的代码示例:

interface ITest {
  prop?: { [key: string]: number } | number
}

const obj: ITest = {}

// Property 'test' does not exist on type 'number | { [key: string]: number; }'.
console.log(obj.prop.test)

1 个答案:

答案 0 :(得分:0)

您正在使用obj或原始类型或未定义的属性类型。 同时设置属性很容易。您需要先阅读“ prop”的类型,然后才能读取它,如下面的代码所示。

 interface ITest {
   prop?: { [key: string]: number } | number
}

//const obj: ITest = { prop: { "age": 22 } };
const obj: ITest = { prop: 55 };

if (typeof obj.prop === 'number') {
      console.log(obj.prop);
}
else {
   Object.keys(obj.prop).forEach(element => {
      console.log(obj.prop[element]);
   });
}

根据评论,以下是从上面的ts代码生成的ES2015代码,我看不到您报告的错误,我有什么遗漏吗?

const obj = { prop: { "age": 22 } };
//const obj: ITest = { prop: 55 };
if (typeof obj.prop === 'number') {
    console.log(obj.prop);
}
else {
    Object.keys(obj.prop).forEach(element => {
        console.log(obj.prop[element]);
    });
}