为何TypeScript工具类型Extract<boolean, false>返回false而非never?
为什么
Extract<boolean, false>返回false而非never? 这核心原因在于TypeScript的分布式条件类型机制——当条件类型的左操作数是一个「裸类型参数」(即没有被包裹在数组、元组、对象等结构中的泛型参数)时,TypeScript会自动将联合类型的每个成员单独代入条件判断,再将结果合并为新的联合类型。
拆解Extract<boolean, false>的执行逻辑
首先要明确:boolean是TypeScript内置的类型别名,本质是true | false的联合类型。而Extract<T, U>的实现是:
type Extract<T, U> = T extends U ? T : never;
这里的T是裸类型参数,所以当传入T = boolean(即true | false)时,会触发分布式条件类型:
- 第一步:将联合类型拆分为单个成员,分别代入判断:
true extends false ? true : never→ 返回neverfalse extends false ? false : never→ 返回false
- 第二步:将两个结果合并为联合类型:
never | false,而never是所有类型的子类型,会被自动吸收,最终结果就是false。
为什么直接写boolean extends false ? true : never会返回never?
因为这里的左操作数不是「裸类型参数」,而是具体的boolean类型,所以不会触发分布式条件类型。TypeScript会直接判断整个boolean类型是否是false的子类型——显然boolean包含true和false,并不完全属于false的子类型,因此条件不成立,返回never。
内容的提问来源于stack exchange,提问作者Niels Gregersen
相关产品推荐
相关产品推荐

