Đây là đầu ra JavaScript của enum đó:
var MyEnum;
(function (MyEnum) {
MyEnum[MyEnum["First"] = 0] = "First";
MyEnum[MyEnum["Second"] = 1] = "Second";
MyEnum[MyEnum["Third"] = 2] = "Third";
})(MyEnum || (MyEnum = {}));
Đó là một đối tượng như thế này:
{
"0": "First",
"1": "Second",
"2": "Third",
"First": 0,
"Second": 1,
"Third": 2
}
Đăng ký thành viên với giá trị chuỗi
TypeScript 2.4 đã thêm khả năng cho enum có thể có các giá trị thành viên chuỗi enum. Vì vậy, có thể kết thúc với một enum giống như sau:
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 = {}));
Nhận tên thành viên
Chúng ta có thể xem ngay ví dụ ở trên để cố gắng tìm ra cách lấy các thành viên enum:
{
"2": "Second",
"First": "First",
"Second": 2,
"Other": "Second"
}
Đây là những gì tôi nghĩ ra:
const e = MyEnum as any;
const names = Object.keys(e).filter(k =>
typeof e[k] === "number"
|| e[k] === k
|| e[e[k]]?.toString() !== k
);
Giá trị thành viên
Khi đã có tên, chúng ta có thể lặp lại chúng để nhận giá trị tương ứng bằng cách thực hiện:
const values = names.map(k => MyEnum[k]);
Lớp mở rộng
Tôi nghĩ rằng cách tốt nhất để làm điều này là tạo các hàm của riêng bạn (ví dụ EnumEx.getNames(MyEnum)
:). Bạn không thể thêm một hàm vào một enum.
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);
}
}