[英]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
}
添加到這個問題是因為我正在尋找解決方案。
最好的解決方案是使用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.