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

TypeScript如何将判别式联合类型转换为对象类型?

基于判别式联合类型自动推导对象类型

假设我们有如下的枚举和判别式联合类型:

enum KEYS {
  A = 'a',
  B = 'b'
  // 可扩展更多枚举成员
}

type TUnion =
  | { keyType: KEYS.A; items: AType[] }
  | { keyType: KEYS.B; items: BType[] }
  // 可扩展更多联合成员

如果手动定义以KEYS成员为键、对应items类型为值的对象类型,会重复键与值的关联逻辑:

type TObj = {
  [KEYS.A]?: AType[]
  [KEYS.B]?: BType[]
  // 新增成员时需手动同步
}

我们可以利用TypeScript的映射类型+条件类型,自动推导该对象类型,无需手动重复关联:

实现方案

// 自动推导的对象类型
type TObj = {
  [K in KEYS]?: Extract<TUnion, { keyType: K }>['items'];
};

原理说明

  • [K in KEYS]:遍历KEYS的所有枚举成员,作为对象的键。
  • Extract<TUnion, { keyType: K }>:从TUnion中筛选出keyType匹配当前键K的联合成员。
  • ['items']:提取筛选出的成员中items属性的类型。
  • 可选属性标记?:保持和手动定义的TObj结构一致,所有键均为可选。

验证示例

// 定义测试类型
type AType = number;
type BType = string;

// 枚举与联合类型
enum KEYS {
  A = 'a',
  B = 'b'
}

type TUnion =
  | { keyType: KEYS.A; items: AType[] }
  | { keyType: KEYS.B; items: BType[] };

// 自动推导对象类型
type TObj = {
  [K in KEYS]?: Extract<TUnion, { keyType: K }>['items'];
};

// 最终推导结果等价于:
// type TObj = {
//   a?: number[] | undefined;
//   b?: string[] | undefined;
// }

当后续扩展KEYS或TUnion的成员时,TObj会自动同步更新,无需手动修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:05:20