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

