为何TypeScript推断Equal<boolean,boolean>为boolean而非true?
问题原因分析
核心背景
TypeScript 中 boolean 是 true | false 的内置联合类型别名,你定义的 Equal 类型会触发分布式条件类型机制——当条件类型中的泛型参数是「裸类型参数」(未被数组、对象等包裹的泛型参数)且为联合类型时,TypeScript 会将联合类型的每个成员单独代入条件判断,再合并所有分支的结果。
对 Equal<boolean, boolean> 的具体推断过程
- 由于
X是裸类型参数且传入的是boolean(即true | false),分布式条件类型启动,将X拆分为true和false两个分支分别计算:- 分支1:X=true
- 外层判断
true extends boolean:结果为true,进入内层判断 - 内层判断
boolean extends true:boolean包含false,false extends true不成立,因此内层结果为false,此分支最终返回false
- 外层判断
- 分支2:X=false
- 外层判断
false extends boolean:结果为true,进入内层判断 - 内层判断
boolean extends false:boolean包含true,true extends false不成立,因此内层结果为false,此分支最终返回false
- 外层判断
- 分支1:X=true
- 两个分支的结果合并为
false | false,理论上应简化为false,若你看到推断结果为boolean,大概率是误将类型提示中的字面量类型与联合类型混淆,或是代码中存在自定义覆盖boolean的干扰逻辑。
修复方案:阻止分布式条件类型
要让 Equal<boolean, boolean> 返回预期的 true,只需将泛型参数包裹在元组中,破坏裸类型参数的触发条件,避免联合类型的分布式拆分:
type Equal<X, Y> = [X] extends [Y] ? ([Y] extends [X] ? true : false) : false; type Type1 = Equal<boolean, boolean>; // => true type Type2 = Equal<boolean, string>; // => false type Type3 = Equal<string, string>; // => true
内容的提问来源于stack exchange,提问作者proxeld
相关产品推荐
相关产品推荐

