如何使TS编译器知道未知变量具有某些属性(不使用“ any”类型)

时间:2019-06-08 10:46:27

标签: typescript types compiler-errors

function f(): unknown {
    return {abc: "ABC"};
}

const a = f();

if (a && a instanceof Object && a.hasOwnProperty("abc")) {
    console.log(a.abc);
}

我有一个变量a,它最初是unknown类型(> = TypeScript 3.0)。 当abc具有该属性时,我想在 if语句中使用a的{​​{1}}属性。

VS code ts error screenshot

但是,如上面的VS代码屏幕截图所示,即使我在if条件下检查了a,TypeScript编译器也出现了TS2339错误。

  

类型“对象”上不存在属性“ abc”。 ts(2339)

我知道我可以通过将a.hasOwnProperty("abc")强制转换为a类型来绕过此错误,但这会使编译器忽略成员名称的错字,并且如果有很多属性,那将是很糟糕的any中的内容,并且与变量a有关。

TypeScript编译器是否有办法知道a具有某些属性?

2 个答案:

答案 0 :(得分:1)

您可以使用{ [index: string]: unknown }而不是unknown来告诉TypeScript您的对象是未知属性的字典。

declare const unfamiliar: { [index: string]: unknown };

if ('foo' in unfamiliar) {
  unfamiliar.foo;
}

答案 1 :(得分:0)

该错误来自aObject的断言。 Object类型不包含abc,因此以下声明没有区别。
如果仅保留a.hasOwnProperty()断言,则它应该起作用。