如何通过TypeScript高级类型从现有枚举生成大写值枚举?
关于TypeScript通过高级类型生成大写值枚举的问题
结论:无法通过高级类型直接生成新的枚举
TypeScript的高级类型(包括Uppercase这类字符串字面量工具)仅作用于类型系统层面,编译后不会生成任何运行时代码。而枚举是编译时会转换为JavaScript对象的值层面结构,类型工具无法直接生成这种运行时存在的枚举实体。
你当前定义的OrderStateUppercase只是一个类型别名,仅能用于类型约束,无法像枚举那样作为值在代码中使用。
替代方案:用对象+类型模拟枚举
如果不想手动维护两份枚举,可以通过运行时代码生成对应大写值的对象,同时搭配类型定义来实现类似枚举的效果:
// 原枚举 export enum OrderState { stateA = "State_A", stateB = "State_B" } // 运行时生成大写值的对象,同时通过类型约束确保值的正确性 export const OrderStateUpper = Object.fromEntries( Object.entries(OrderState).map(([key, value]) => [key, value.toUpperCase()]) ) as { [K in keyof typeof OrderState]: Uppercase<typeof OrderState[K]> }; // 导出对应的类型,用于类型约束 export type OrderStateUpper = typeof OrderStateUpper[keyof typeof OrderStateUpper];
这种方式下,OrderStateUpper对象拥有和目标枚举完全一致的结构,值均为大写格式,同时对应的类型也能提供和原生枚举相同的类型检查能力,无需手动重复定义。
内容的提问来源于stack exchange,提问作者frankfullstack
相关产品推荐
相关产品推荐

