为何TypeScript交集类型的计算结果存在差异?
为什么TypeScript交集类型在属性冲突时会有两种不同的计算结果?
TypeScript交集类型的核心规则是:当两个接口相交时,同名属性的类型取两者的交集。若该交集为never,TS在不同场景下的归约行为存在差异,结合你使用的4.9.5版本,具体分析如下:
1. 属性类型为跨分支基本类型(number vs boolean)
interface A { name: string; age: number; } interface B { gender: string; age: boolean; } type D = A & B; // D: never
在TS 4.9.5中,number和boolean属于完全不相交的基本类型分支(数值类型与布尔类型),它们的交集number & boolean是never。此时TS会判定整个交集类型完全不可能存在,直接将D归约为never,不再保留其他属性。
2. 属性类型为同分支原始类型(number vs string)
interface A { name: string; age: number; } interface B { gender: string; age: string; } type D = A & B; // D: { name: string; gender: string; age: never; }
number和string的交集同样是never,但它们同属于原始类型分支。TS 4.9.5在这种场景下不会直接将整个类型归约为never,而是保留两个接口的所有非冲突属性,仅将冲突的age属性类型设为never。这是因为TS认为,虽然age属性无法被赋值,但对象的其他属性逻辑上是合法的(只是该类型永远无法被实例化)。
版本差异补充
在TypeScript 5.x及以上版本中,该规则已统一:无论属性冲突是跨分支还是同分支的原始类型,交集类型都会保留所有属性,冲突属性的类型设为never,不会再出现整个类型归约为never的情况。你看到的差异是4.9.5版本特有的类型归约逻辑导致的。
内容的提问来源于stack exchange,提问作者Xiao Guang
相关产品推荐
相关产品推荐

