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
相关产品推荐
相关产品推荐

