迭代字符串枚举

时间:2017-12-19 23:50:48

标签: node.js typescript

我必须遗漏一些东西,但我找到了几种方法来迭代枚举但不是字符串枚举。

给出以下枚举:

export enum Locales {
  En = 'en',
  Fr = 'fr',
  De = 'de',
  Es = 'es',
  It = 'it',
  Nl = 'nl',
  No = 'no',
  Tr = 'tr',
}

我想要实现的目标:

我想迭代该字符串枚举,以便获取值(!)。我尝试了什么:

for (const key of Object.keys(Locales)) {
  const locale: string = Locales[key];
  console.log(locale); // Should print 'en', 'fr' and so on
}

以上代码的问题:

由于严格的tsconfig(不允许隐式anys),我无法将其编译为javascript。由于这不是我的项目,我也无法更改此tsconfig。它突出显示key处的Locales[key]变量,错误对我有意义:

  

[ts]元素隐式具有“任意”类型,因为索引表达式是   不是'数字'类型。

问题:

使用Typescript 2.6 +迭代字符串枚举以获取它的值的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

正如beta开发人员建议的那样,如果使用类型断言as keyof typeof Locales,则可以获得正确的密钥类型。或者您可以将其包装在Object.keys()函数的类型安全变体中,如下所示:

export enum Locales {
  En = 'en',
  Fr = 'fr',
  De = 'de',
  Es = 'es',
  It = 'it',
  Nl = 'nl',
  No = 'no',
  Tr = 'tr',
}

function enumKeys<E>(e: E): (keyof E)[] {
  return Object.keys(e) as (keyof E)[];
}

for (const key of enumKeys(Locales)) {
  const locale: string = Locales[key];
  console.log(locale); 
}

此外,对于记录,旧式for .. in循环仍然有效:

for (let key in Locales) {
    let locale = Locales[key];
    console.log(locale);
}

答案 1 :(得分:1)

@Artem和@betadeveloper指出我的方法可以使用keyof typeof Locales类型。我最终提出的解决方案看起来像这样:

const keys: (keyof typeof Locales)[] = <(keyof typeof Locales)[]>Object.keys(Locales);
for (const key of keys) {
  const locale: string = Locales[key];
  console.log(locale); // Prints 'en', 'fr' and so on
}

答案 2 :(得分:1)

<强> Lodash

Lodash是一个很好的选择,因为它易于使用并提供易于理解的API。从lodash方法中,forIn是您正在寻找的选项。要获得typescript declaration files,您可以安装:

npm install @types/lodash

使用forIn方法,您可以获得Locales对象的

import { forIn } from 'lodash'

enum Locales {
  En = 'en',
  Fr = 'fr'
  // ...
}

forIn(Locales, (value, key) => console.log(value, key))

答案 3 :(得分:0)

补充这个问题是因为我正在寻找解决方案。

最好的解决方案是使用 Object.values() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values

Object.values(Locales).forEach((locale) => console.log(locale));

// or

for (const locale of Object.values(Locales)) {
  console.log(locale);
}

还要考虑使用 Object.entries() 来获取字符串值枚举的键和值。