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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:45:08