Esta es la salida de JavaScript de esa enumeración:
var MyEnum;
(function (MyEnum) {
MyEnum[MyEnum["First"] = 0] = "First";
MyEnum[MyEnum["Second"] = 1] = "Second";
MyEnum[MyEnum["Third"] = 2] = "Third";
})(MyEnum || (MyEnum = {}));
Que es un objeto como este:
{
"0": "First",
"1": "Second",
"2": "Third",
"First": 0,
"Second": 1,
"Third": 2
}
Miembros de enumeración con valores de cadena
TypeScript 2.4 agregó la capacidad para que las enumeraciones posiblemente tengan valores de miembro de enumeración de cadena. Entonces, es posible terminar con una enumeración similar a la siguiente:
enum MyEnum {
First = "First",
Second = 2,
Other = "Second"
}
var MyEnum;
(function (MyEnum) {
MyEnum["First"] = "First";
MyEnum[MyEnum["Second"] = 2] = "Second";
MyEnum["Other"] = "Second";
})(MyEnum || (MyEnum = {}));
Obtener nombres de miembros
Podemos ver el ejemplo inmediatamente anterior para tratar de averiguar cómo obtener los miembros enum:
{
"2": "Second",
"First": "First",
"Second": 2,
"Other": "Second"
}
Esto es lo que se me ocurrió:
const e = MyEnum as any;
const names = Object.keys(e).filter(k =>
typeof e[k] === "number"
|| e[k] === k
|| e[e[k]]?.toString() !== k
);
Valores de los miembros
Una vez que tenemos los nombres, podemos recorrerlos para obtener el valor correspondiente haciendo:
const values = names.map(k => MyEnum[k]);
Clase de extensión
Creo que la mejor manera de hacer esto es crear sus propias funciones (ej. EnumEx.getNames(MyEnum)
). No puede agregar una función a una enumeración.
class EnumEx {
private constructor() {
}
static getNamesAndValues(e: any) {
return EnumEx.getNames(e).map(n => ({ name: n, value: e[n] as string | number }));
}
static getNames(e: any) {
return Object.keys(e).filter(k =>
typeof e[k] === "number"
|| e[k] === k
|| e[e[k]]?.toString() !== k
);
}
static getValues(e: any) {
return EnumEx.getNames(e).map(n => e[n] as string | number);
}
}