如何使用打字稿获取枚举的所有值?

k0p*_*kus 9 arrays enums object typescript

给定一个TypeScript枚举:

export enum Color {
    Red,
    Green,
    Blue,
}
Run Code Online (Sandbox Code Playgroud)

我想在数组中得到它的所有值:

["Red", "Green", "Blue"]
Run Code Online (Sandbox Code Playgroud)

然而,当我在那个enum上工作时

const colors = Object.keys(Color);
Run Code Online (Sandbox Code Playgroud)

我得到由其索引和值组成的怪异数组:

[ '0', '1', '2', 'Red', 'Green', 'Blue' ]
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我怎么才能得到这些值?

k0p*_*kus 34

如果你有 ES 2017 运动,你可以使用:

Object.values(Color)
Run Code Online (Sandbox Code Playgroud)

对于较旧的 JavaScript 版本,您可以过滤掉数字键:

const colors = Object.keys(Color).filter((item) => {
    return isNaN(Number(item));
});
console.log(colors.join("\n"));
Run Code Online (Sandbox Code Playgroud)

这将打印:

Red
Green
Blue
Run Code Online (Sandbox Code Playgroud)

TypeScript 枚举最终会转译为一个普通的 JavaScript 对象:

{ 
  '0': 'Red', 
  '1': 'Green',
  '2': 'Blue',
  Red: 0,
  Green: 1,
  Blue: 2
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用数字索引作为键来获取值,并且可以使用该值在枚举中查找其索引:

console.log(Color[0]); // "Red"
console.log(Color["0"]); // "Red"
console.log(Color["Red"]) // 0
Run Code Online (Sandbox Code Playgroud)

  • 为什么不直接写“Object.values(Color)” (21认同)
  • 就像 @k0pernikus 所说,TypeScript 枚举的编译方式允许从值查找索引。因此 `Object.keys` 和 `Object.values` 返回一个具有相同值的数组(无论类型如何)。我使用 `Object.keys(Color).filter(k => isNaN(Number(k)));` 来获取我的枚举键列表。 (9认同)
  • 实际上,如果值是数字并且枚举是字符串,则 Object.values(Color) 可以返回一个键。示例: ` enum StringEnum { First = 'First Value', Second = 'Second Value', Third = 4 } ` 将返回带有值的 `Third`。 (3认同)
  • @pavle `Object.values` 是 ECMAScript 2017 的一部分。`Object.keys` 是 ECMAScript 2015 / ES5 的一部分。 (2认同)
  • 无法在这里发布另一个答案,链接的“重复”是另一个问题。这是包装成泛型函数的 k0pernikus 方法:[如何在 TypeScript 中获取枚举值数组](https://blog.oyam.dev/typescript-enum-values/) (2认同)