TypeScript如何从交叉类型构成的Brand类型中正确提取泛型参数
问题原因
TypeScript 进行条件类型推断时,不会主动展开Brand这个类型别名的交叉结构去匹配泛型参数,导致infer A无法正确识别出交叉中的原始类型部分,所以你原来的写法提取到的不是预期的number类型。
解决方法
方法1:直接匹配交叉结构
不需要依赖Brand别名,直接在条件类型中匹配交叉类型的结构,明确拆分出原始类型和品牌属性部分:
type ExtractT<T> = T extends infer A & { __brand: unknown } ? A : never
这个写法会直接把传入的品牌类型拆成交叉的两部分,A会被正确推断为原始的number类型,此时ExtractT<Foo>的结果就是number,调用test(1)不会再报错。
方法2:通用去品牌工具类型
如果需要适配更多品牌类型的场景,也可以写通用的工具类型,同时兼容原始类型和对象类型的品牌:
// 通用去品牌类型 type Unbrand<T> = T extends { __brand: any } ? Omit<T, '__brand'> : T // 替换你的ExtractT type ExtractT<T> = Unbrand<T>
对于原始类型的品牌,Omit会自动忽略不存在的属性,返回原始类型本身;对于对象类型的品牌,也可以正确剔除__brand属性得到原始对象类型。
内容的提问来源于stack exchange,提问作者devshorts
相关产品推荐
相关产品推荐

