如何自动移除TypeScript联合类型中的$case字段生成依赖类型
自动转换带
$case的联合类型为紧凑形式 现有如下TypeScript联合类型:
interface A { a: number; b: string; } interface B { b: number; c: string[]; } type Orig = { $case: 'a'; a: A; } | { $case: 'b'; b: B; }
需要自动生成移除$case字段的目标类型:
type Goal = { a: A; } | { b: B; }
可以通过映射类型+条件类型实现,无需手动编写目标类型:
// 定义工具类型,提取联合类型中每个成员的非$case字段 type RemoveCase<T> = T extends { $case: infer K } ? { [P in K]: T[P] } : never; // 生成目标类型 type Goal = RemoveCase<Orig>;
原理说明
- 利用条件类型的
infer关键字,提取每个联合成员的$case值作为键名K; - 通过映射类型,以
K为键,取出原类型中对应键的字段值T[P],构建只保留目标字段的新类型; - 对联合类型使用条件类型时,TypeScript会自动分发到每个联合成员上处理,最终得到期望的联合类型。
验证结果:Goal的类型完全等同于手动定义的目标类型,当Orig新增或修改成员时,Goal会自动同步更新。
内容的提问来源于stack exchange,提问作者Vito De Tullio
相关产品推荐
相关产品推荐

