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

如何将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];
}

双向转换示例

  1. SpecialWeekDay → WeekDay
const specialDay: SpecialWeekDay = SpecialWeekDay.MONDAY;
const normalDay: WeekDay = convertEnum(specialDay, SpecialWeekDay, WeekDay);
// normalDay 结果为 WeekDay.MONDAY
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:30:14