如何获取枚举条目的名称?

枚举 TypeScript

小胖Gil

2020-06-02

我想迭代一个TypeScript enum类型并获取每个枚举的符号名称,例如:

enum myEnum { entry1, entry2 }

for (var entry in myEnum) { 
    // use entry's name here, e.g., "entry1"
}

第4240篇《如何获取枚举条目的名称?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

14个回答
古一 2020.06.02

这不是您问题的确切答案,但这是解决您问题的一个技巧。

export module Gender {

  export enum Type {
    Female = 1,
    Male = 2
  };

  export const List = Object.freeze([
    Type[Type.Female] ,
    Type[Type.Male]
  ]);

}

您可以按照自己的方式扩展列表模型。

export const List = Object.freeze([
    { name: Type[Type.Female], value: Type.Female } ,
    { name: Type[Type.Male], value: Type.Male }
  ]);

现在,您可以通过以下方式使用它:

for(const gender of Gender.List){
  console.log(gender.name);
  console.log(gender.value);
}

要么:

if(i === Gender.Type.Male){
  console.log("I am a man.");
}
伊芙妮 2020.06.02

如果您有枚举

enum Diet {
  KETO = "Ketogenic",
  ATKINS = "Atkins",
  PALEO = "Paleo",
  DGAF = "Whatever"
}

然后,您可以获取键和值,例如:

Object.keys(Diet).forEach((d: Diet) => {
  console.log(d); // KETO
  console.log(Diet[d]) // Ketogenic
});
猴子 2020.06.02

我编写了一个辅助函数来枚举枚举:

static getEnumValues<T extends number>(enumType: {}): T[] {
  const values: T[] = [];
  const keys = Object.keys(enumType);
  for (const key of keys.slice(0, keys.length / 2)) {
    values.push(<T>+key);
  }
  return values;
}

用法:

for (const enumValue of getEnumValues<myEnum>(myEnum)) {
  // do the thing
}

该函数返回可以轻松枚举的内容,并且还强制转换为枚举类型。

启人 2020.06.02

我发现该解决方案更加优雅:

for (let val in myEnum ) {

 if ( isNaN( parseInt( val )) )
     console.log( val );
}

它显示:

bar 
foo
若合 2020.06.02

根据TypeScript文档,我们可以使用带有静态函数的Enum进行此操作。

使用静态函数获取枚举名称

enum myEnum { 
    entry1, 
    entry2 
}

namespace myEnum {
    export function GetmyEnumName(m: myEnum) {
      return myEnum[m];
    }
}


now we can call it like below
myEnum.GetmyEnumName(myEnum.entry1);
// result entry1 

要阅读有关具有静态功能的Enum的更多信息,请遵循以下链接 https://basarat.gitbooks.io/typescript/docs/enums.html

Tom凯 2020.06.02

在所有情况下(即使值是字符串),对我来说唯一可行的解​​决方案是:

var enumToString = function(enumType, enumValue) {
    for (var enumMember in enumType) {
        if (enumType[enumMember]==enumValue) return enumMember
    }
}
猿Pro 2020.06.02

老问题了,但是,为什么不使用const对象图呢?

而不是这样做:

enum Foo {
    BAR = 60,
    EVERYTHING_IS_TERRIBLE = 80
}

console.log(Object.keys(Foo))
// -> ["60", "80", "BAR", "EVERYTHING_IS_TERRIBLE"]
console.log(Object.values(Foo))
// -> ["BAR", "EVERYTHING_IS_TERRIBLE", 60, 80]

执行此操作(请注意as const演员表):

const Foo = {
    BAR: 60,
    EVERYTHING_IS_TERRIBLE: 80
} as const

console.log(Object.keys(Foo))
// -> ["BAR", "EVERYTHING_IS_TERRIBLE"]
console.log(Object.values(Foo))
// -> [60, 80]
斯丁前端 2020.06.02

此解决方案也起作用。

enum ScreenType {
    Edit = 1,
    New = 2,
    View = 4
}

var type: ScreenType = ScreenType.Edit;

console.log(ScreenType[type]); //Edit
MonsterKKNear 2020.06.02

enum-values遇到相同问题时,可以使用我写软件包:

Git:枚举值

var names = EnumValues.getNames(myEnum);
伽罗理查德 2020.06.02

从TypeScript 2.4开始,枚举将不再包含该密钥作为成员。来自TypeScript自述文件

需要注意的是,不能对通过字符串初始化的枚举进行反向映射以获取原始枚举成员名称。换句话说,您不能编写Colors [“ RED”]来获取字符串“ Red”。

我的解决方案:

export const getColourKey = (value: string ) => {
    let colourKey = '';
    for (const key in ColourEnum) {
        if (value === ColourEnum[key]) {
            colourKey = key;
            break;
        }
    }
    return colourKey;
};
Tony凯 2020.06.02

从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()}`);

并获得以下输出:

一个是第一

Itachi 2020.06.02

对我来说,一种更简单,实用,直接的方式来了解发生了什么事情,它是以下列举:

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];

上面的两种情况是更常见的情况,因为通常您对特定值的名称和以通用方式序列化值更感兴趣。

小胖 2020.06.02

尽管已经提供了答案,但几乎没有人指出文档

这是一个片段

enum Enum {
    A
}
let nameOfA = Enum[Enum.A]; // "A"

请记住,字符串枚举成员根本不会生成反向映射。

西里神奇 2020.06.02

您发布的代码可以使用;它将打印出枚举的所有成员,包括枚举成员的值。例如,以下代码:

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 = parseInt(enumMember, 10) >= 0
   if (isValueProperty) {
      console.log("enum member: ", myEnum[enumMember]);
   }
}

That will print out just the names:

Enum member: bar

Enum member: foo

Caveat: this slightly relies on an implementation detail: TypeScript compiles enums to a JS object with the enum values being members of the object. If TS decided to implement them different in the future, the above technique could break.

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android