簡體   English   中英

迭代字符串枚舉

[英]Iterate on string enum

我一定遺漏了一些東西,但我找到了幾種方法來遍歷枚舉而不是字符串枚舉。

給出了以下枚舉:

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(不允許隱式任何),我無法將其編譯為 javascript。 由於這不是我的項目,我也無法更改此 tsconfig。 它突出顯示了Locales[key]處的key變量,該錯誤對我來說很有意義:

[ts] 元素隱式具有“任何”類型,因為索引表達式不是“數字”類型。

問題:

使用 Typescript 2.6+ 迭代字符串枚舉以獲取其值的正確方法是什么?

正如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);
}

@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
}

Lodash

Lodash是一個很好的選擇,因為它易於使用,並提供易於理解的API。 從lodash方法中, forIn是您正在尋找的選項。 要獲取打字稿聲明文件 ,您可以安裝:

npm install @types/lodash

使用forIn方法,您將獲得Locales對象的

import { forIn } from 'lodash'

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

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

添加到這個問題是因為我正在尋找解決方案。

最好的解決方案是使用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()來獲取字符串值枚舉的鍵和值。

 const entries = Object.entries(Locales);
  let LocalesArray= [];
  entries.forEach((type) => {
    LocalesArray.push({ key: type[0], name: type[1] });
  });

迭代枚舉值並將其轉換為 object 數組的簡單方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM