为何自定义类型IsFirstTrue会解析为boolean类型?
问题分析与解决
先看你的代码:
type IsFirstTrue<T extends unknown[]> = T extends [infer First, ...infer Rest] ? First extends true ? true : false : false // let a: boolean let a: IsFirstTrue<[boolean]>
你遇到的问题核心是TypeScript条件类型的分配性行为:当条件类型的左侧是一个联合类型时,TypeScript会自动对联合类型的每个成员单独进行条件判断,最后把结果合并成新的联合类型。
这里First被推断为boolean(也就是true | false的联合类型),当执行First extends true时,会拆成两个独立判断:
true extends true→ 返回truefalse extends true→ 返回false
最终结果就是true | false,也就是boolean类型,这就是为什么变量a的类型是boolean而不是预期的false。
要解决这个问题,只需要禁用条件类型的分配性,方法是把条件两边都用方括号包裹,变成检查数组类型的匹配,而不是联合类型成员的匹配:
type IsFirstTrue<T extends unknown[]> = T extends [infer First, ...infer Rest] ? [First] extends [true] // 这里改成数组包裹的形式 ? true : false : false // 现在 let a: false let a: IsFirstTrue<[boolean]>
这样[First]是一个包含联合类型的数组,而不是联合类型本身,TypeScript不会触发分配性判断,只会检查整个数组类型是否匹配[true]。因为[boolean]和[true]不匹配,所以直接返回false,符合你的预期。
内容的提问来源于stack exchange,提问作者Aschente
相关产品推荐
相关产品推荐

