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

能否复用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:45:36