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

TypeScript泛型联合仅首个参数分发,如何实现任意参数均分发?

解决TypeScript泛型联合类型双向分发问题

问题原因

TypeScript的分布式条件类型仅在裸泛型参数(未被数组、对象等包裹)位于extends关键字左侧时,才会对联合类型进行分发处理。原代码中只有参数A满足这个条件,因此仅当A为联合类型时会触发分发;而B位于extends右侧,无法触发分发,导致Type<2, 2 | 3>只返回"eq"而非预期的"eq" | "neq"。

解决方案

通过嵌套两层恒真的条件类型,让两个参数都以裸类型的形式出现在extends左侧,从而触发双向的联合分发:

type Type<A extends number, B extends number> = 
  A extends A 
    ? B extends B 
      ? A extends B ? 'eq' : 'neq' 
      : never 
    : never;

代码解释

  • A extends A:这是一个恒成立的条件,但由于A是裸泛型参数,会触发A的联合类型分发(将联合的每个成员单独传入处理)。
  • B extends B:在A的每个分发分支中,同样以恒真条件触发B的联合类型分发,实现A和B的所有成员两两比较。
  • 内层的A extends B ? 'eq' : 'neq'完成单个成员的比较逻辑,最终将所有分支的结果合并为联合类型。

测试验证

  • test0 = Type<2, 2 | 3>:B被分发为2和3,分别与2比较,结果为"eq" | "neq"(符合预期)。
  • test1 = Type<2 | 3, 2>:A被分发为2和3,分别与2比较,结果为"eq" | "neq"(符合预期)。
  • Type<1 | 2, 2 | 3>:所有成员两两比较后,结果为"neq" | "eq" | "eq" | "neq",最终合并为"eq" | "neq"。

内容的提问来源于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 06:28:32