You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:00:02