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

Typescript 如何提取联合类型中的各成员独立类型

解决方案

我们可以基于TypeScript的分布式条件类型,实现你需要的通用联合成员提取工具:

// 通用类型提取工具:从联合类型U中提取所有包含属性P的成员
type ExtractUnionMemberByProp<P extends string | number | symbol, U> = U extends Record<P, any> ? U : never;

使用示例

针对你给出的联合类型,直接调用工具即可得到对应独立类型:

export type UnionedType = {a: number; /* 其他属性 */} | {b: string; /* 其他属性 */};

// 提取带a属性的成员类型
type TypeA = ExtractUnionMemberByProp<'a', UnionedType>;
// 等价于 type TypeA = {a: number; /* 其他属性 */}

// 提取带b属性的成员类型
type TypeB = ExtractUnionMemberByProp<'b', UnionedType>;
// 等价于 type TypeB = {b: string; /* 其他属性 */}

实现原理

  • TypeScript的条件类型对联合类型默认是分布式执行的,会逐个遍历联合中的每个成员进行条件判断
  • 上述工具类型会判断每个联合成员是否满足「拥有属性P」的约束,满足的就返回该成员本身,不满足的返回never
  • 最终结果中never类型会自动从联合类型中移除,剩下的就是目标成员类型

如果需要更严格的匹配规则,比如同时校验属性的类型,可以使用扩展版工具:

// 扩展版:同时匹配属性名和属性类型
type ExtractUnionMemberByPropType<P extends string | number | symbol, PropType, U> = U extends Record<P, PropType> ? U : never;

// 示例:只提取a属性为number类型的成员
type TypeAWithNumberProp = ExtractUnionMemberByPropType<'a', number, UnionedType>;

内容的提问来源于stack exchange,提问作者TwoFingerRightClick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:15:04