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

TypeScript替代内置enum最佳实践:如何用数组简化实现?

用数组生成无重复的TypeScript替代Enum方案

当然可以用数组来生成这类替代Enum的结构,完全避免重复编写字符串字面量,同时保留你提到的所有优势。下面是两种简洁的实现方式:

方式一:辅助函数生成(推荐)

通过一个通用辅助函数,把字符串数组直接转成键值同名的常量对象,同时自动推导精确类型:

const createStringEnum = <T extends string>(arr: readonly T[]) => {
  return arr.reduce((acc, key) => {
    acc[key] = key;
    return acc;
  }, {} as { [K in T]: K });
};

// 使用示例
const MyEnum = createStringEnum(['name', 'email'] as const);
type MyEnum = keyof typeof MyEnum;

方式二:Object.fromEntries实现

如果不想额外写辅助函数,也可以用Object.fromEntries直接转换数组:

const enumKeys = ['name', 'email'] as const;
const MyEnum = Object.fromEntries(enumKeys.map(key => [key, key])) as { 
  [K in typeof enumKeys[number]]: K 
};
type MyEnum = typeof enumKeys[number];

为什么能保留原有优势?

  • 支持传入MyEnum.name作为参数:生成的MyEnum对象是常量,键值均为对应字面量,类型完全匹配MyEnum类型约束;
  • 直接使用字符串字面量:MyEnum类型本质是数组元素的字面量联合类型(如'name' | 'email'),无需导入对象即可直接用字面量;
  • 避免数字Enum的keys问题:如果要生成数字版的替代Enum,只需调整数组元素为数字,生成的对象键值一致,Object.keys()只会返回字符串形式的键,不会出现内置数字Enum那种键值同时出现在keys中的问题。

注意:必须加上as const,确保数组元素被推导为字面量类型而非宽泛的string/number,这样生成的对象和类型才是精确的。

内容的提问来源于stack exchange,提问作者NeoZoom.lua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:50:04