我必须遗漏一些东西,但我找到了几种方法来迭代枚举但不是字符串枚举。
给出以下枚举:
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 +迭代字符串枚举以获取它的值的正确方法是什么?
答案 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()
来获取字符串值枚举的键和值。