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

