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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:37:47