如何用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
相关产品推荐
相关产品推荐

