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

TypeScript:泛型类型中条件类型为何表现不一致?

问题解答

二者表现不同的原因

核心差异在于分布式条件类型的触发机制:

  • 泛型工具Check<P, Q>中,P是裸类型参数(没有被数组、对象等类型包裹)。当传入联合类型A时,TypeScript会自动触发分布式条件类型:将联合类型的每个成员单独代入P extends Q进行判断,再把结果合并为新的联合类型。在你的例子中,{a: number} extends B返回true,{b: string} extends B返回false,合并后得到true | false,也就是boolean类型。
  • 直接写A extends B ? true : false时,A是具体的联合类型,不是裸泛型参数,不会触发分布式逻辑。TypeScript会将整个联合类型作为单个整体判断是否满足extends条件,因此返回的是整体判断的结果true。

让Check正确工作的方法

根据你的需求,有两种调整方式:

1. 让Check和直接写法行为一致(不触发分布式)

将泛型参数P包裹在非裸类型中(比如元组),破坏分布式条件类型的触发条件:

type Check<P, Q> = [P] extends [Q] ? true : false;
type Y = Check<A, B>; // 结果为true,和X一致

此时[P]是包含联合类型的元组,TypeScript会将整个联合类型作为整体与[Q]比较,逻辑和直接写A extends B完全相同。

2. 保持分布式行为(对联合成员逐个判断)

如果你的需求就是让Check对联合类型的每个成员单独校验,那当前的实现本身就是正确的,此时Y返回boolean是预期结果——因为联合类型中有的成员满足条件,有的不满足。

内容的提问来源于stack exchange,提问作者Eugene Ghanizadeh Khoub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:34:50