TypeScript enum to object array

2022-08-30 01:36:09

我有一个以这种方式定义的枚举:

export enum GoalProgressMeasurements {
    Percentage = 1,
    Numeric_Target = 2,
    Completed_Tasks = 3,
    Average_Milestone_Progress = 4,
    Not_Measured = 5
}

但是,我希望它表示为来自我们的API的对象数组/列表,如下所示:

[{id: 1, name: 'Percentage'}, 
 {id: 2, name: 'Numeric Target'},
 {id: 3, name: 'Completed Tasks'},
 {id: 4, name: 'Average Milestone Progress'},
 {id: 5, name: 'Not Measured'}]

有没有简单和原生的方法来做到这一点,或者我是否必须构建一个函数,将枚举同时转换为int和字符串,并将对象构建到数组中?


答案 1

如果您使用的是 ES8

对于这种情况,只有它可以完美地工作。它将为您提供给定枚举的值数组。

enum Colors {
  WHITE = 0,
  BLACK = 1,
  BLUE = 3
}

const colorValueArray = Object.values(Colors); //[ 'WHITE', 'BLACK', 'BLUE', 0, 1, 3 ]

你会得到这样的.所有键都将位于数组的前半部分,所有值将位于后半部分。colorValueArray[ 'WHITE', 'BLACK', 'BLUE', 0, 1, 3 ]

即使这种枚举也可以正常工作

enum Operation {
    READ,
    WRITE,
    EXECUTE
}

但是这个解决方案不适用于像这样的异构枚举

enum BooleanLikeHeterogeneousEnum {
  No = 0,
  Yes = "YES",
}

答案 2

一个棘手的问题是,TypeScript将“双重”映射发出的对象中的枚举,因此可以通过键和值来访问它。

enum MyEnum {
    Part1 = 0,
    Part2 = 1
}

将发出为

{
   Part1: 0,
   Part2: 1,
   0: 'Part1',
   1: 'Part2'
}

因此,您应该在映射之前先过滤对象。因此@Diullei的解决方案有正确的答案。这是我的实现:

// Helper
const StringIsNumber = value => isNaN(Number(value)) === false;

// Turn enum into array
function ToArray(enumme) {
    return Object.keys(enumme)
        .filter(StringIsNumber)
        .map(key => enumme[key]);
}

像这样使用它:

export enum GoalProgressMeasurements {
    Percentage,
    Numeric_Target,
    Completed_Tasks,
    Average_Milestone_Progress,
    Not_Measured
}

console.log(ToArray(GoalProgressMeasurements));