TypeScript可选属性分配初始化

时间:2019-12-02 23:15:12

标签: typescript

为什么Typescript(v3.7.2)无法静态分析嵌套对象分配中对象的可选属性?

例如:

interface Foo {
  bar?: {
    baz: string;
  }
}

const foo: Foo = {
  bar: {
    baz: 'foobar',
  },
};

// Object is possibly 'undefined'.ts(2532)
const baz1 = foo.bar.baz;

foo.bar = { baz: 'foobar'};

// No error
const baz2 = foo.bar.baz;

1 个答案:

答案 0 :(得分:2)

如果您给对象文字赋予类型注释,则编译器将不会尝试推断其类型。您已明确声明foo的类型为Foo;因此,编译器通过查看类型foo.bar的声明来确定Foo的类型,而不是根据对象常量foo所声明的更具体的类型来确定。仅当没有类型注释时才进行类型推断。

如果您希望foo具有从对象文字推断出的更具体的类型,请删除类型注释:写成const foo = ...而不是const foo: Foo = ...

第二个示例foo.bar = { baz: 'foobar' };是一个赋值,而不是一个声明,因此编译器仅需检查右侧是否具有用于赋值目标的适当类型(它确实如此)。编译器还会缩小控制流类型,因为它知道foo.bar在赋值之后不能被不确定。