如何将TypeScript函数交集类型转换为并集类型?
TypeScript中函数交集转并集与多调用签名拆分方案
一、通用交集转并集实现(IntersectionToUnion)
可以通过TypeScript的分布式条件类型和逆变位置类型推断实现交集到并集的转换,该方案在TS 2.8+版本即可稳定使用,后续版本完全兼容:
type IntersectionToUnion<T> = (T extends any ? (x: T) => void : never) extends (x: infer U) => void ? U : never;
函数交集转并集示例
针对你提到的函数交集类型:
type FuncIntersection = ((a: 1) => 2) & ((a: 1 | 2) => 2); type FuncUnion = IntersectionToUnion<FuncIntersection>; // 最终类型:((a: 1) => 2) | ((a: 1 | 2) => 2)
二、多调用签名类型转函数并集
TypeScript中,带多调用签名的类型本质上和函数交集类型等价(两者都要求值满足所有签名约束),因此可直接复用上述IntersectionToUnion:
// 多调用签名类型 type MultiCallSignature = { (a: 1): 2; (a: 1 | 2): 2; }; // 转换为函数并集 type SigUnion = IntersectionToUnion<MultiCallSignature>; // 最终类型:((a: 1) => 2) | ((a: 1 | 2) => 2)
三、关于多调用签名推断与拆分的疑问
TypeScript能推断多调用签名,但无法直接拆分出独立类型,核心原因在于类型系统的设计逻辑:
- 多调用签名(或函数交集)属于约束叠加,表示值必须同时满足所有签名要求,是「与」逻辑的体现;
- TS的类型推断是收敛式推导:从值的实际行为出发,收集所有它能满足的签名并合并,保证类型约束的严谨性;
- 拆分多签名为独立类型是发散式操作,TS默认不提供直接语法支持,但我们可以通过分布式条件类型的特性(利用逆变位置的类型推断)绕过这个限制,实现拆分。
内容的提问来源于stack exchange,提问作者zedryas
相关产品推荐
相关产品推荐

