在 TypeScript 中将所有枚举名称作为数组获取
Get all Enum Names as an Array in TypeScript
将所有枚举名称作为数组获取:
- 将枚举作为参数传递给
Object.keys()
方法。 - 如果枚举是数字,则从数组中过滤出枚举值。
- 对于字符串枚举,该
Object.keys()
方法返回一个包含枚举名称的数组。
索引.ts
// ✅ NUMERIC Enums enum NumericEnum { Yes, No, Maybe, } const names1 = Object.keys(NumericEnum).filter((v) => isNaN(Number(v))); console.log(names1); // 👉️ ['Yes', 'No', 'Maybe'] const values1 = Object.values(NumericEnum).filter((v) => !isNaN(Number(v))); console.log(values1); // 👉️ [0, 1, 2] for (const name1 of names1) { console.log(name1); // 👉️ Yes, No, Maybe } // ✅ STRING Enums enum StringEnum { Yes = 'Y', No = 'N', Maybe = 'M', } const names2 = Object.keys(StringEnum); console.log(names2); // 👉️ ['Yes', 'No', 'Maybe'] const values2 = Object.values(StringEnum); console.log(values2); // 👉️ ['Y', 'N', 'M']
TypeScript 中的枚举是真实的对象,存在于运行时。这就是我们能够将枚举传递给
Object.keys
方法的原因。
该Object.keys()
方法返回一个包含对象键的数组。
索引.ts
// 👇️ ['name', 'age'] console.log(Object.keys({ name: 'Tom', age: 30 }));
但是,数字和字符串枚举的输出是不同的。
索引.ts
// ✅ NUMERIC Enums enum NumericEnum { Yes, No, Maybe, } // ✅ STRING Enums enum StringEnum { Yes = 'Y', No = 'N', Maybe = 'M', } // 👇️ ['0', '1', '2', 'Yes', 'No', 'Maybe'] console.log(Object.keys(NumericEnum)); // 👇️ ['Yes', 'No', 'Maybe'] console.log(Object.keys(StringEnum));
请注意,当将数字枚举传递给该
Object.keys
方法时,我们会得到一个包含值和枚举名称的数组,而对于字符串枚举,我们只会获得名称。这就是为什么我们使用filter()
第一个示例中的方法 – 从数组中过滤掉枚举值。
如果需要遍历枚举名称数组,可以使用for...of
循环或Array.forEach
方法。
索引.ts
// ✅ STRING Enums enum StringEnum { Yes = 'Y', No = 'N', Maybe = 'M', } const names2 = Object.keys(StringEnum); console.log(names2); // 👉️ ['Yes', 'No', 'Maybe'] for (const name of names2) { console.log(name); // 👉️ "Yes, No, Maybe" } names2.forEach((name, index) => { console.log(name); // 👉️ "Yes, No, Maybe" });
请注意,您还可以在使用数字枚举时使用反向映射。
索引.tsx
// ✅ NUMERIC Enums enum NumericEnum { Yes, No, Maybe, } const yes = NumericEnum.Yes; console.log(yes); // 👉️ 0 const nameOfYes = NumericEnum[yes]; console.log(nameOfYes); // 👉️ Yes
我们使用Yes
数字枚举 ( 0
) 中的属性值来获取相应的名称 ( Yes
)。
这是它如何工作的更直接的表示。
索引.tsx
// ✅ NUMERIC Enums enum NumericEnum { Yes, No, Maybe, } console.log(NumericEnum[0]); // 👉️ Yes console.log(NumericEnum[1]); // 👉️ No console.log(NumericEnum[2]); // 👉️ Maybe
不幸的是,您只能使用这种方法来获取数字枚举的名称。
字符串枚举成员根本不会生成反向映射。
请注意,如果您使用const 枚举,上面的示例将不起作用
,因为 const 枚举只能使用常量枚举表达式,并在编译期间被完全删除。