我想迭代 TypeScript 枚举对象并获取每个枚举值的名称,例如: enum myEnum { entry1, entry2 }
for (var entry in myEnum) {
// use entry's name here, e.g., "entry1"
}
我想迭代 TypeScript 枚举对象并获取每个枚举值的名称,例如: enum myEnum { entry1, entry2 }
for (var entry in myEnum) {
// use entry's name here, e.g., "entry1"
}
虽然答案已经提供,但几乎没有人指向文档
这是一小段代码
enum SampleEnum {
A,
}
let nameOfA = SampleEnum[SampleEnum.A]; // "A"
0
或1
怎么样? export enum Octave { ZERO = 0, ONE = 1 }
- Stephane[value]: name
形式存储的对象。你可以通过 Object.keys(enum)
获取所有值、Object.values(enum)
获取所有名称,或使用 for(const [value, name] of Object.entries(enum)) { ... }
一次性进行迭代。需要注意的是,当你获取枚举的值时,它们将会是字符串,而不是像你期望的那样是数字(因为在 JavaScript 中,对象的键总是字符串)。 - user0103你发布的代码是有效的;它将打印出枚举的所有成员,包括枚举成员的值。例如,以下代码:
enum myEnum { bar, foo }
for (var enumMember in myEnum) {
console.log("enum member: ", enumMember);
}
将会输出如下内容:
Enum member: 0
Enum member: 1
Enum member: bar
Enum member: foo
如果你只想获取成员名称而不是值,可以像这样操作:
for (var enumMember in myEnum) {
var isValueProperty = Number(enumMember) >= 0
if (isValueProperty) {
console.log("enum member: ", myEnum[enumMember]);
}
}
那将仅打印出名称:
Enum member: bar
Enum member: foo
注意:这在某种程度上依赖于一些实现细节:TypeScript将枚举编译为一个带有枚举值作为对象成员的JS对象。如果TS决定在未来以不同的方式实现它们,上述技巧可能会失效。
对我来说,更简单、实用和直接的理解正在发生的事情的方法是以下枚举:
enum colors { red, green, blue };
将基本上转换为这个:
var colors = { red: 0, green: 1, blue: 2,
[0]: "red", [1]: "green", [2]: "blue" }
由于这个原因,以下内容将会成立:
colors.red === 0
colors[colors.red] === "red"
colors["red"] === 0
这将创建一种简单的方法来获取枚举名称,如下所示:
var color: colors = colors.red;
console.log("The color selected is " + colors[color]);
它还创建了一种将字符串转换为枚举值的好方法。
var colorName: string = "green";
var color: colors = colors.red;
if (colorName in colors) color = colors[colorName];
上述两种情况更为常见,因为通常您对特定值的名称以及以通用方式序列化值更感兴趣。Object.keys(myEnum).map(key => myEnum[key]).filter(value => typeof value === 'string') as string[];
Object.values(myEnum).filter(value => typeof value === 'string') as string[];
来实现。该代码将枚举对象 myEnum
中所有值类型为字符串的值筛选出来,并转换成一个字符串数组。 - NoneObject.keys(myEnum)
不就足以获取枚举对象中键名的数组吗? - Bruno Negrão Zicaenum Test1 { A = "C", B = "D"}
返回 ["C", "D"]
。这是值,而不是键。 - polkovnikov.phObject.keys(myEnum)
不仅会返回枚举的字符串键,还会返回它们在枚举中对应的索引。
例如enum Color { Black, White }
console.log(Object.keys(Color)) // '0', '1', 'Black', 'White'
- Adilet Soronov假设您遵循规则并仅生成具有数字值的枚举,您可以使用此代码。这段代码可以正确处理名称巧合为有效数字的情况。
enum Color {
Red,
Green,
Blue,
"10" // wat
}
var names: string[] = [];
for(var n in Color) {
if(typeof Color[n] === 'number') names.push(n);
}
console.log(names); // ['Red', 'Green', 'Blue', '10']
Object.prototype.foo = 1;
- polkovnikov.ph看起来这里的答案都不能在 strict
模式下使用字符串枚举。
考虑以下枚举:
enum AnimalEnum {
dog = "dog", cat = "cat", mouse = "mouse"
}
使用AnimalEnum["dog"]
访问可能会导致以下错误:
Element implicitly has an 'any' type because expression of type 'any' can't be used to index type 'typeof AnimalEnum'.ts(7053)
。
针对这种情况的正确解决方法是将其编写为:
AnimalEnum["dog" as keyof typeof AnimalEnum]
keyof
和 typeof
的绝妙解决方案!其他解决方案似乎相当晦涩,但毕竟我认为Typescript需要在枚举的开发者体验上不断改进。 - Shawn从TypeScript 2.4开始,枚举可以包含字符串初始化器https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html
这使您可以编写如下内容:
enum Order {
ONE = "First",
TWO = "Second"
}
console.log(`One is ${Order.ONE.toString()}`);
并获得此输出:
One是第一个
在当前的 TypeScript 版本1.8.9 中,我使用了类型化枚举:
export enum Option {
OPTION1 = <any>'this is option 1',
OPTION2 = <any>'this is option 2'
}
带有结果的Javascript对象:
Option = {
"OPTION1": "this is option 1",
"OPTION2": "this is option 2",
"this is option 1": "OPTION1",
"this is option 2": "OPTION2"
}
所以我必须通过键和值进行查询,仅返回值:
let optionNames: Array<any> = [];
for (let enumValue in Option) {
let optionNameLength = optionNames.length;
if (optionNameLength === 0) {
this.optionNames.push([enumValue, Option[enumValue]]);
} else {
if (this.optionNames[optionNameLength - 1][1] !== enumValue) {
this.optionNames.push([enumValue, Option[enumValue]]);
}
}
}
然后我会在一个数组中收到选项键:
optionNames = [ "OPTION1", "OPTION2" ];
optionNames = [["OPTION1", "这是选项1"], ["OPTION2", "这是选项2"]]
,但总体上我欣赏你删除双重反向条目的想法,其他人都认为值始终是一个数字。 - Dima Karaush[["OPTION1", "this is option 1"], ["OPTION2", "this is option 2"]]
。即使取这些元组的第一个元素,它在枚举Test2 { A,B }上产生错误,生成了["0", "1", "A", "B"]
。 - polkovnikov.ph这个解决方案也可行。
enum ScreenType {
Edit = 1,
New = 2,
View = 4
}
var type: ScreenType = ScreenType.Edit;
console.log(ScreenType[type]); //Edit
简而言之
如果你的 enums
如下所示:
export enum Colors1 {
Red = 1,
Green = 2,
Blue = 3
}
获取特定文本和值:
console.log(Colors1.Red); // 1
console.log(Colors1[Colors1.Red]); // Red
获取值和文本的列表:
public getTextAndValues(e: { [s: number]: string }) {
for (const enumMember in e) {
if (parseInt(enumMember, 10) >= 0) {
console.log(e[enumMember]) // Value, such as 1,2,3
console.log(parseInt(enumMember, 10)) // Text, such as Red,Green,Blue
}
}
}
this.getTextAndValues(Colors1)
如果你的enums
如下:
export enum Colors2 {
Red = "Red",
Green = "Green",
Blue = "Blue"
}
获取特定的文本和值:
console.log(Colors2.Red); // Red
console.log(Colors2["Red"]); // Red
获取值和文本列表:
public getTextAndValues(e: { [s: string]: string }) {
for (const enumMember in e) {
console.log(e[enumMember]);// Value, such as Red,Green,Blue
console.log(enumMember); // Text, such as Red,Green,Blue
}
}
this.getTextAndValues(Colors2)
enum A { B = -1 }
是完全有效的。 - polkovnikov.ph
getAllEnumValues
和getAllEnumKeys
函数,供您使用。 - transangfor (const [name, value] of MyEnum) {
的本地支持。希望有一天这将变得更加容易!(PR链接:https://github.com/microsoft/TypeScript/pull/42465,问题链接:https://github.com/microsoft/TypeScript/issues/42457) - TimmmmEnumType.name()
方法。 - html_programmer