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

如何在TypeScript中将Enum转换为常量对象?(React TS函数组件)

将TypeScript数字枚举转换为同名常量对象

针对你需要把ProductStatus枚举转换为纯常量对象的需求,这里提供几种自动转换的方案(避免手动维护重复代码):

方案一:使用Object.fromEntries快速过滤转换

利用TypeScript数字枚举编译后生成双向映射对象(同时包含键->值和值->键)的特性,我们可以过滤掉数值键的条目,只保留原枚举的字符串键与对应数值:

export enum ProductStatus {
  Draft = 1,
  Review = 2,
  Approved = 3,
  Rejected = 4,
  Billed = 5,
  Collected = 6,
  Unpayable = 7,
  WorkInProgress = 8,
  ReadyToReview = 9,
  NeedsRevision = 10,
  Failed = 11,
}

// 转换为纯常量对象
export const ProductStatusObj = Object.fromEntries(
  Object.entries(ProductStatus).filter(([key]) => isNaN(Number(key)))
) as { [K in keyof typeof ProductStatus]: number };

说明

  • Object.entries(ProductStatus)会取出枚举编译后的所有键值对,包括"Draft":1和"1":"Draft"这类反向映射
  • filter(([key]) => isNaN(Number(key)))过滤掉键为数字的条目,只保留原枚举的字符串键
  • 类型断言as { [K in keyof typeof ProductStatus]: number }保证转换后的对象类型与原枚举的键值结构完全一致

方案二:手动遍历构建对象(兼容性更强)

如果需要更明确的逻辑控制,可以手动遍历枚举键并构建对象:

export enum ProductStatus {
  Draft = 1,
  Review = 2,
  Approved = 3,
  Rejected = 4,
  Billed = 5,
  Collected = 6,
  Unpayable = 7,
  WorkInProgress = 8,
  ReadyToReview = 9,
  NeedsRevision = 10,
  Failed = 11,
}

// 定义枚举转对象的类型工具
type EnumStringKeys<T> = Exclude<keyof T, number>;
type EnumToPlainObject<T> = { [K in EnumStringKeys<T>]: T[K] };

// 构建常量对象
export const ProductStatusObj: EnumToPlainObject<typeof ProductStatus> = {} as any;
Object.keys(ProductStatus).forEach(key => {
  if (!isNaN(Number(key))) return;
  ProductStatusObj[key as EnumStringKeys<typeof ProductStatus>] = ProductStatus[key as EnumStringKeys<typeof ProductStatus>];
});

注意事项

  • 不要同时导出同名的enum和const(如你示例中的export const ProductStatus),这会导致标识符重复报错,转换后的对象建议使用不同名称(比如ProductStatusObj)
  • 两种方案都会在枚举新增/修改值时自动同步,不需要手动维护常量对象,比手写重复代码更可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:06:02