我想迭代一个TypeScript枚举对象,并获得每个枚举符号名称,例如: enum myEnum {entry1, entry2}
for (var entry in myEnum) {
// use entry's name here, e.g., "entry1"
}
我想迭代一个TypeScript枚举对象,并获得每个枚举符号名称,例如: enum myEnum {entry1, entry2}
for (var entry in myEnum) {
// use entry's name here, e.g., "entry1"
}
当前回答
这里的答案似乎都不能在严格模式下使用string-enum。
考虑enum为:
enum AnimalEnum {
dog = "dog", cat = "cat", mouse = "mouse"
}
使用AnimalEnum["dog"]访问可能会导致如下错误:
元素隐式具有“any”类型,因为类型“any”的表达式不能用于索引类型“typeof AnimalEnum”.ts(7053)。
这种情况下的正确解,写为:
AnimalEnum["dog" as keyof typeof AnimalEnum]
其他回答
你可以这样做,我认为这是最短、最干净、最快的:
Object.entries(test).filter(([key]) => (!~~key && key !== "0"))
给定以下混合类型枚举定义:
enum testEnum {
Critical = "critical",
Major = 3,
Normal = "2",
Minor = "minor",
Info = "info",
Debug = 0
};
它将会变成以下内容:
var testEnum = { 关键:“至关重要的”, 主要:3, 正常:“2”, 小:“小”, 信息:“信息”, 调试:0, [0]:“关键”, [1]: 3, [2]:“2”, [3]:“小”, [4]:“信息”, [5]: 0 } 函数safeEnumEntries(test) { return Object.entries(test).filter(([key]) => (!~~key && key !== "0"); }; console.log (safeEnumEntries (testEnum));
执行函数后,你只会得到好的条目:
[
["Critical", "critical"],
["Major", 3],
["Normal", "2"],
["Minor", "minor"],
["Info", "info"],
["Debug", 0]
]
如果你只搜索名称,然后迭代使用:
Object.keys(myEnum).map(key => myEnum[key]).filter(value => typeof value === 'string') as string[];
我看不正确的答案看累了,就自己做了。
这个有测试。 适用于所有类型的枚举。 正确地输入。
type EnumKeys<Enum> = Exclude<keyof Enum, number>
const enumObject = <Enum extends Record<string, number | string>>(e: Enum) => {
const copy = {...e} as { [K in EnumKeys<Enum>]: Enum[K] };
Object.values(e).forEach(value => typeof value === 'number' && delete copy[value]);
return copy;
};
const enumKeys = <Enum extends Record<string, number | string>>(e: Enum) => {
return Object.keys(enumObject(e)) as EnumKeys<Enum>[];
};
const enumValues = <Enum extends Record<string, number | string>>(e: Enum) => {
return [...new Set(Object.values(enumObject(e)))] as Enum[EnumKeys<Enum>][];
};
enum Test1 { A = "C", B = "D"}
enum Test2 { A, B }
enum Test3 { A = 0, B = "C" }
enum Test4 { A = "0", B = "C" }
enum Test5 { undefined = "A" }
enum Test6 { A = "undefined" }
enum Test7 { A, B = "A" }
enum Test8 { A = "A", B = "A" }
enum Test9 { A = "B", B = "A" }
console.log(enumObject(Test1)); // {A: "C", B: "D"}
console.log(enumObject(Test2)); // {A: 0, B: 1}
console.log(enumObject(Test3)); // {A: 0, B: "C"}
console.log(enumObject(Test4)); // {A: "0", B: "C"}
console.log(enumObject(Test5)); // {undefined: "A"}
console.log(enumObject(Test6)); // {A: "undefined"}
console.log(enumObject(Test7)); // {A: 0,B: "A"}
console.log(enumObject(Test8)); // {A: "A", B: "A"}
console.log(enumObject(Test9)); // {A: "B", B: "A"}
console.log(enumKeys(Test1)); // ["A", "B"]
console.log(enumKeys(Test2)); // ["A", "B"]
console.log(enumKeys(Test3)); // ["A", "B"]
console.log(enumKeys(Test4)); // ["A", "B"]
console.log(enumKeys(Test5)); // ["undefined"]
console.log(enumKeys(Test6)); // ["A"]
console.log(enumKeys(Test7)); // ["A", "B"]
console.log(enumKeys(Test8)); // ["A", "B"]
console.log(enumKeys(Test9)); // ["A", "B"]
console.log(enumValues(Test1)); // ["C", "D"]
console.log(enumValues(Test2)); // [0, 1]
console.log(enumValues(Test3)); // [0, "C"]
console.log(enumValues(Test4)); // ["0", "C"]
console.log(enumValues(Test5)); // ["A"]
console.log(enumValues(Test6)); // ["undefined"]
console.log(enumValues(Test7)); // [0, "A"]
console.log(enumValues(Test8)); // ["A"]
console.log(enumValues(Test9)); // ["B", "A"]
在线版本。
Typescript游乐场示例
enum TransactionStatus {
SUBMITTED = 'submitted',
APPROVED = 'approved',
PAID = 'paid',
CANCELLED = 'cancelled',
DECLINED = 'declined',
PROCESSING = 'processing',
}
let set1 = Object.entries(TransactionStatus).filter(([,value]) => value === TransactionStatus.SUBMITTED || value === TransactionStatus.CANCELLED).map(([key,]) => {
return key
})
let set2 = Object.entries(TransactionStatus).filter(([,value]) => value === TransactionStatus.PAID || value === TransactionStatus.APPROVED).map(([key,]) => {
return key
})
let allKeys = Object.keys(TransactionStatus)
console.log({set1,set2,allKeys})
虽然答案已经提供了,但几乎没有人指向文档
下面是一个片段
enum Enum {
A
}
let nameOfA = Enum[Enum.A]; // "A"
请记住,string enum成员根本不会生成反向映射。