枚举值字符串中的枚举数组

时间:2020-01-21 13:50:41

标签: angular typescript

我正在尝试将枚举值字符串转换为实际的枚举。我知道您可以比较一个字符串并使用它完成操作(例如,MyEnum.FirstEnum ==='My_First_Enum'将返回true),但是如果我可以返回枚举而不是字符串,那就太好了。

export enum MyEnum {
  FirstEnum = 'My_First_Enum',
  SecondEnum = 'My_Second_Enum',
  ThirdEnum = 'My_Third_Enum'
}

getMyEnums(): MyEnum[] {
  // These would be an input argument, but for the sake of this example, I thought this was easier to understand
  const stringEnumValues = ['My_Second_Enum', 'My_Third_Enum'];

  // Convert to enums (result is [undefined, undefined])
  return stringEnumValues.map(e => MyEnum[e]);
}

3 个答案:

答案 0 :(得分:2)

您需要将字符串强制转换为枚举类型的键,这是如何通过代表枚举键的字符串数组和代表值的字符串数组来实现的:

通过键获取:

getMyEnums(): MyEnum[] {

  const stringEnumValues = ['SecondEnum', 'ThirdEnum'];  
  return stringEnumValues.map( (e : keyof typeof MyEnum) => MyEnum[e])

}

通过值获取:

getMyEnums2(): MyEnum[] {

  const stringEnumValues = ['My_First_Enum', 'My_Second_Enum'];  
  return stringEnumValues.map( (e : MyEnum) => e)

}

示例:https://stackblitz.com/edit/angular-yd6yhe?file=src/app/app.component.ts

来源:https://blog.mikeski.net/development/javascript/typescript-enums-to-from-string/

答案 1 :(得分:2)

尝试使用Object.entries方法,然后使用filter输入您想要的值stringEnumValues,然后使用map过滤值:

const stringEnumValues = ['My_Second_Enum', 'My_Third_Enum'];  
let result = Object.entries(MyEnum)
                      .filter(([k,v])=> stringEnumValues.includes(v))
                      .map(([ke, vl]) => MyEnum[ke]);

A work example at stackblitz can be seen here

答案 2 :(得分:0)

为什么不为此目的尝试冻结的JSON哈希?

export const MyEnum = Object.freeze({
  'FirstEnum': 'My_First_Enum',
  'SeconfEnum': 'My_Second_Enum',
  'ThirdEnum': 'My_Third_Enum',
  'My_First_Enum': 'FirstEnum',
  'My_Second_Enum': 'SeconfEnum',
  'My_Third_Enum': 'ThirdEnum'
});