能否复用TypeScript枚举键来创建第二个枚举?
复用枚举键创建TypeScript枚举的方法
可以复用PORTRAIT、SQUARE、LANDSCAPE这些枚举键,但TypeScript原生枚举语法无法直接基于现有枚举生成新枚举。不过可以借助枚举编译后的对象特性,或者共享键集合的方式实现,以下是两种可行方案:
方案一:共享键集合生成双版本枚举
先定义一份共享的枚举键常量数组,再分别生成数字枚举和字符串枚举式对象:
// 定义共享的枚举键常量数组 const ORIENTATION_KEYS = ['PORTRAIT', 'SQUARE', 'LANDSCAPE'] as const; // 数字枚举,直接使用共享键 export enum OrientationAsNumber { PORTRAIT, SQUARE, LANDSCAPE } // 字符串枚举式对象,类型与原生枚举完全一致 export const OrientationAsString = Object.fromEntries( ORIENTATION_KEYS.map(key => [key, key.toLowerCase()]) ) as { [K in typeof ORIENTATION_KEYS[number]]: Lowercase<K> };
这里的OrientationAsString是类型安全的对象,使用方式和原生枚举完全相同,同时避免了重复编写枚举键。
方案二:基于已有枚举生成新的枚举式对象
如果已经定义了其中一个枚举,可以直接提取它的键来生成另一个版本:
export enum OrientationAsNumber { PORTRAIT, SQUARE, LANDSCAPE } // 过滤数字枚举的反向映射键,提取真正的枚举成员键 const orientationKeys = Object.keys(OrientationAsNumber) .filter(k => isNaN(Number(k))) as Array<keyof typeof OrientationAsNumber>; // 创建字符串枚举式对象 export const OrientationAsString = Object.fromEntries( orientationKeys.map(key => [key, key.toLowerCase()]) ) as Record<typeof orientationKeys[number], Lowercase<typeof orientationKeys[number]>>;
这个方案无需额外定义键集合,直接复用已有枚举的键,减少重复代码。
补充说明
如果一定要用原生enum语法定义字符串枚举,无法完全避免重复编写枚举键(因为原生枚举要求显式声明每个成员),但上述枚举式对象在类型校验、使用方式上和原生枚举几乎没有差异,足以满足绝大多数业务场景需求。
内容的提问来源于stack exchange,提问作者BuZZ-dEE
相关产品推荐
相关产品推荐

