为什么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;
答案 0 :(得分:2)
如果您给对象文字赋予类型注释,则编译器将不会尝试推断其类型。您已明确声明foo
的类型为Foo
;因此,编译器通过查看类型foo.bar
的声明来确定Foo
的类型,而不是根据对象常量foo
所声明的更具体的类型来确定。仅当没有类型注释时才进行类型推断。
如果您希望foo
具有从对象文字推断出的更具体的类型,请删除类型注释:写成const foo = ...
而不是const foo: Foo = ...
。
第二个示例foo.bar = { baz: 'foobar' };
是一个赋值,而不是一个声明,因此编译器仅需检查右侧是否具有用于赋值目标的适当类型(它确实如此)。编译器还会缩小控制流类型,因为它知道foo.bar
在赋值之后不能被不确定。