TypeScript条件类型为何拆分()=>boolean为联合类型?如何保留boolean返回值?
问题原因解释
这是TypeScript分布式条件类型的特性导致的:
- 当条件类型的左侧是一个裸类型参数(即没有被包裹在数组、元组、对象等其他类型中的类型参数,比如这里的
U),且该参数是联合类型时,TypeScript会自动将联合类型的每个成员单独代入条件类型计算,最后把所有结果合并成新的联合类型。 boolean在TypeScript中本质是true | false的联合类型,所以当U为boolean时,U extends E会分别用true和false代入判断(两者都不继承string),最终得到() => true | () => false的联合类型,而非预期的() => boolean。
解决方案
核心思路是破坏分布式条件类型的触发条件——不让U作为裸类型参数出现在extends左侧,具体有两种常用方法:
方法1:将类型参数包裹在元组中
把U extends E改为[U] extends [E],让U被包裹在元组类型里,不再是裸类型,TypeScript就会把整个联合类型作为一个整体判断:
type A<U, E> = [U] extends [E] ? () => U : () => U; const a: A<boolean, string> = () => Math.random() < 0.5; // 编译正常
方法2:简化类型(针对示例场景)
你的示例中条件分支的返回值完全相同,可直接省略条件判断,直接返回目标类型:
type A<U> = () => U; const a: A<boolean> = () => Math.random() < 0.5; // 编译正常
如果实际业务中条件分支有不同逻辑,优先使用方法1。
内容的提问来源于stack exchange,提问作者Lyx St
相关产品推荐
相关产品推荐

