You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:10:58