如何将TypeScript枚举转换为同键的另一个枚举?
TypeScript 相似枚举双向转换方案
我有两个结构相似的TypeScript枚举,需要实现它们之间的双向转换。枚举定义如下:
export enum WeekDay { MONDAY = "MONDAY", TUESDAY = "TUESDAY", WEDNESDAY = "WEDNESDAY", THURSDAY = "THURSDAY", FRIDAY = "FRIDAY", SATURDAY = "SATURDAY", SUNDAY = "SUNDAY" }
export enum SpecialWeekDay { MONDAY = "Moon's Day", TUESDAY = "Tyr's Day", WEDNESDAY = "Odin's Day", THURSDAY = "Thor's Day", FRIDAY = "Freya's Day", SATURDAY = "Saturn's Day", SUNDAY = "Sun's Day" }
我之前尝试用以下代码转换,但无效,问题出在代码是通过值而非键来匹配:
let value: SpecialWeekDay = SpecialWeekDay.MONDAY; let newValue: WeekDay = WeekDay[SpecialWeekDay[value] as keyof typeof WeekDay];
我需要一种无需手动创建映射的简单实现,且支持双向转换。
解决方案
由于两个枚举的键完全一致,可以基于枚举键来实现通用转换,无需依赖值的匹配。
通用转换函数
function convertEnum<T extends Record<string, string>, U extends Record<string, string>>( value: T[keyof T], fromEnum: T, toEnum: U ): U[keyof U] { // 根据枚举值找到对应的键 const key = Object.keys(fromEnum).find(k => fromEnum[k] === value) as keyof T; // 返回目标枚举对应键的值 return toEnum[key]; }
双向转换示例
- SpecialWeekDay → WeekDay
const specialDay: SpecialWeekDay = SpecialWeekDay.MONDAY; const normalDay: WeekDay = convertEnum(specialDay, SpecialWeekDay, WeekDay); // normalDay 结果为 WeekDay.MONDAY
- WeekDay → SpecialWeekDay
const normalDay: WeekDay = WeekDay.FRIDAY; const specialDay: SpecialWeekDay = convertEnum(normalDay, WeekDay, SpecialWeekDay); // specialDay 结果为 SpecialWeekDay.FRIDAY
原代码失效原因
字符串枚举不会自动生成反向映射,SpecialWeekDay[value]中value是枚举值(比如"Moon's Day"),枚举对象里没有这个键,因此无法获取到对应的枚举键,导致转换失败。而基于键的转换逻辑利用了两个枚举键完全一致的特性,能稳定完成转换。
内容的提问来源于stack exchange,提问作者Jamie P
相关产品推荐
相关产品推荐

