TypeScript交叉类型为何有时像合并有时是真正交集?
TypeScript交叉类型
&表现差异的本质 TypeScript的交叉类型&从始至终都是取类型对应值集合的交集,之所以看起来在对象和原始类型上表现不同,是因为两种类型的“值集合”逻辑不一样:
原始类型的交叉:严格的空交集
原始类型(string、number、boolean等)的值集合是互斥的——不存在一个值同时属于string和number的集合,所以string & number的结果是never(代表空值集合的类型),这完全符合“交集”的数学定义:两个没有重叠元素的集合,交集为空。
对象类型的交叉:值集合交集的表现为属性合并
对于对象类型来说,一个值要同时属于两个对象类型的集合,意味着它必须同时满足两个类型的所有约束——也就是要拥有两个类型的全部属性。比如:
type Employee = { id: number; name: string }; type CEO = { company: string; name: string }; type Both = Employee & CEO;
Both类型的取值必须同时是Employee(有id和name)和CEO(有company和name),所以最终的结构是三个属性的合并,但本质是值的交集:只有同时满足两个对象约束的值,才会被归为Both类型。
如果两个对象类型存在同名但类型冲突的属性,交叉后的类型也会变成never,比如:
type A = { name: string }; type B = { name: number }; type C = A & B; // C的类型是never,因为不存在同时是string和number的name属性值
这也进一步验证了交叉类型的本质是值的交集——当属性类型冲突时,没有值能同时满足两个约束,所以结果是空集合never。
内容的提问来源于stack exchange,提问作者Stefanie Gauss
相关产品推荐
相关产品推荐

