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

如何自动移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:12:13