【问题标题】:How to make the TS compiler know an unknown variable has some properties (without the usage of `any` type)如何让 TS 编译器知道未知变量具有某些属性(不使用 `any` 类型)
【发布时间】:2019-06-08 22:37:50
【问题描述】:
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)。 当a 具有该属性时,我想在if 语句 中使用aabc 属性。

但是,正如上面的 VS 代码屏幕截图所示,即使我在 if 条件中检查了 a.hasOwnProperty("abc"),TypeScript 编译器也会给出 TS2339 错误。

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

我知道我可以通过将a转换为any类型来绕过这个错误,但是它会使编译器忽略成员名称的拼写错误,如果a中有很多属性会很糟糕以及与变量 a 相关的许多事情。

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

【问题讨论】:

    标签: typescript types compiler-errors


    【解决方案1】:

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

    declare const unfamiliar: { [index: string]: unknown };
    
    if ('foo' in unfamiliar) {
      unfamiliar.foo;
    }
    

    【讨论】:

      【解决方案2】:

      错误来自aObject 的断言。 Object 类型不包含 abc,因此以下断言没有区别。
      如果您只保留a.hasOwnProperty() 断言,它应该可以工作。

      【讨论】:

      • 如果aany 类型,它将起作用。但是aunknown类型,所以这种情况下不会消除编译错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多