这是该枚举的JavaScript输出:
var MyEnum;
(function (MyEnum) {
MyEnum[MyEnum["First"] = 0] = "First";
MyEnum[MyEnum["Second"] = 1] = "Second";
MyEnum[MyEnum["Third"] = 2] = "Third";
})(MyEnum || (MyEnum = {}));
就像这样的一个物体:
{
"0": "First",
"1": "Second",
"2": "Third",
"First": 0,
"Second": 1,
"Third": 2
}
具有字符串值的枚举成员
TypeScript 2.4 增加了枚举可能具有字符串枚举成员值的功能。因此,可能会得到一个类似以下的枚举:
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 = {}));
获取成员名称
我们可以查看上面的示例,尝试弄清如何获取枚举成员:
{
"2": "Second",
"First": "First",
"Second": 2,
"Other": "Second"
}
这是我想到的:
const e = MyEnum as any;
const names = Object.keys(e).filter(k =>
typeof e[k] === "number"
|| e[k] === k
|| e[e[k]]?.toString() !== k
);
成员变量
一旦我们拥有了这些名称,我们就可以通过循环来获取相应的值,方法如下:
const values = names.map(k => MyEnum[k])
扩展类
我认为最好的方法是创建你自己的函数(例如 EnumEx.getNames(MyEnum)
)。你不能向一个枚举类型中添加函数。
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);
}
}
for of
语句而不是for in
。 - David Sherret