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

如何用TypeScript枚举键定义EventResponseType的event_type类型

如何用字符串枚举的键定义类型中的联合类型?

你当前的代码如下:

字符串枚举定义:

enum EventTypeEnum {
  TYPE_ONE = "Type 1",
  TYPE_TWO = "Type 2",
  TYPE_THREE = "Type 3"
};

API响应类型:

type EventResponseType = {
  event_id: string;
  event_type: "TYPE_ONE" | "TYPE_TWO" | "TYPE_THREE";
};

转换后的UI展示类型及转换函数:

type EventType = EventResponseType & {
  event_type_text: EventTypeEnum;
};

const loadEvent = (eventResponse: EventResponseType): EventType => {
  return {
    ...eventResponse,
    event_type_text: EventTypeEnum[eventResponse.event_type]
  };
}

你尝试用Object.keys(EventTypeEnum)替代手动罗列的联合类型但无效,核心原因是Object.keys是运行时API,返回值类型是string[],无法在TypeScript的类型层面提供精确的枚举键联合类型。

解决方案:使用keyof typeof获取枚举键的类型

TypeScript中要提取枚举的键组成联合类型,需要用keyof typeof EnumName的组合:

  • typeof EventTypeEnum会获取枚举对象的静态类型
  • keyof操作符会提取该类型的所有键,也就是枚举成员名组成的联合类型

修改后的EventResponseType代码如下:

type EventResponseType = {
  event_id: string;
  // 自动关联枚举的键,无需手动维护联合类型
  event_type: keyof typeof EventTypeEnum;
};

这样event_type的类型会自动和EventTypeEnum的键保持同步,后续枚举新增或修改成员时,event_type的类型约束会自动更新,同时你的loadEvent函数也能正常通过类型检查——因为eventResponse.event_type现在是合法的枚举键类型,用来索引EventTypeEnum完全符合类型规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:02:42