exclude 和 extract 是 typescript 中处理联合类型的两个核心工具类型,前者实现差集(剔除能赋值给 u 的成员),后者实现交集(保留能赋值给 u 的成员),均基于条件类型 t extends u ? ... : ...,仅分支返回值相反。

Exclude 和 Extract 是 TypeScript 中处理联合类型的两个核心工具类型,它们分别实现“差集”和“交集”语义,底层都依赖条件类型 T extends U ? ... : ... 的判断逻辑,但行为相反。
Exclude:从联合类型中剔除匹配项(差集)
它把类型 T 中所有能赋值给 U 的成员排除掉,只保留“不属于 U”的部分。
语法:Exclude<t u></t>
-
原理:对
T中每个成员X,检查X extends U是否成立;若成立,结果为never(即被过滤);否则保留X -
典型用例:剔除不想要的类型,比如去掉
null和undefined:type NonNull = Exclude<string number null undefined></string>→string | number -
注意:只作用于联合类型。如果
T不是联合类型(如单个string),且string extends U成立,则整个结果为never
Extract:提取同时属于两个类型的成员(交集)
它只保留 T 中也能赋值给 U 的成员,相当于取两者的公共部分。
使用 Vite 8、React 19、Tailwind CSS v4、shadcn/ui、Biome、Vitest 和 Hono 构建全栈 TypeScript 应用,涵盖前端(Vite/Rolldown 构建 + 开发)...
语法:Extract<t u></t>
-
原理:对
T中每个成员X,检查X extends U是否成立;若成立,保留X;否则为never -
典型用例:从一大组字面量中筛选出符合某约束的子集:
type Status = 'idle' | 'loading' | 'success' | 'error'; type LoadingStates = Extract<status></status>→'loading' | 'error' -
延伸用法:配合
keyof提取接口共有的属性名,再结合索引访问构建新类型(如交集对象类型)
对比记忆口诀
两者结构完全对称,区别仅在条件分支的返回值:
Exclude<t u> = T extends U ? never : T</t>Extract<t u> = T extends U ? T : never</t>
可以理解为:Exclude 是“删掉能匹配的”,Extract 是“留下能匹配的”。它们不修改类型结构,只做静态筛选,运行时无开销,纯编译期行为。










