TypeScript联合类型中对象字面量prop为何解析为never[]而非Base?
TypeScript联合类型属性的类型差异解析
type Base = string[] interface Foo { prop: Base } interface Bar { prop: Base } type FooBar = Foo | Bar const test: FooBar = { prop: [] // property prop resolves to never[] here } test.prop // property prop resolves to Base here
在上述TypeScript代码中,Foo和Bar接口的prop属性定义完全一致,均为Base类型。为何声明test常量时,其prop属性被解析为never[],而访问test.prop时却解析为Base类型?
原因解析
这是TypeScript在对象字面量类型推断和联合类型属性访问时的两种不同处理逻辑导致的:
赋值阶段:对象字面量的类型推断
当你写{ prop: [] }这个对象字面量时,TypeScript会先独立推断空数组的类型——因为没有元素提供类型线索,空数组的默认推断类型是never[]。随后TypeScript会检查这个never[]是否能赋值给FooBar的prop属性:由于never是string的子类型,never[]自然是string[](即Base)的子类型,所以赋值合法。编辑器在这里显示的是字面量本身的推断类型never[],而非目标类型Base。访问阶段:联合类型的属性合并逻辑
当你访问test.prop时,TypeScript会对联合类型Foo | Bar的所有成员取该属性的交集类型(所有成员共有的属性类型)。因为Foo和Bar的prop属性都是Base,它们的交集就是Base本身,所以test.prop会被解析为Base类型。
内容的提问来源于stack exchange,提问作者user2534830
相关产品推荐
相关产品推荐

