感谢polkovnikov.ph,我终于找到了一个解决大多数使用情况的有效方法。
问题的有效解决方案
type Descripted<T> = {
[K in keyof T]: {
readonly id: T[K];
readonly description: string;
}
}[keyof T]
export function enumToDescriptedArray<T>(enumeration: T, separatorRegex: RegExp = /_/g): Descripted<T>[] {
return (Object.keys(enumeration) as Array<keyof T>)
.filter(key => isNaN(Number(key)))
.filter(key => typeof enumeration[key] === "number" || typeof enumeration[key] === "string")
.map(key => ({
id: enumeration[key],
description: String(key).replace(separatorRegex, ' '),
}));
}
例子:
export enum GoalProgressMeasurements {
Percentage = 1,
Numeric_Target = 2,
Completed_Tasks = 3,
Average_Milestone_Progress = 4,
Not_Measured = 5
}
console.log(enumToDescriptedArray(GoalProgressMeasurements))
另外,我使用的一种有用的实用函数是将枚举对象映射到其可用值数组的方法:
映射器
type NonFunctional<T> = T extends Function ? never : T;
export function enumToArray<T>(enumeration: T): NonFunctional<T[keyof T]>[] {
return Object.keys(enumeration)
.filter(key => isNaN(Number(key)))
.map(key => enumeration[key])
.filter(val => typeof val === "number" || typeof val === "string");
}
工作用例
enum Colors1 {
WHITE = 0,
BLACK = 1
}
console.log(Object.values(Colors1));
console.log(enumToArray(Colors1));
enum Colors2 {
WHITE = "white",
BLACK = "black"
}
console.log(Object.values(Colors2));
console.log(enumToArray(Colors2));
enum Colors4 {
WHITE = "white",
BLACK = 0
}
console.log(Object.values(Colors4));
console.log(enumToArray(Colors4));
enum Colors3 {
WHITE = "white",
BLACK = "black"
}
namespace Colors3 {
export function fun() {}
}
console.log(Object.values(Colors3));
console.log(enumToArray(Colors3));
GoalProgressMeasurements[GoalProgressMeasurements.Completed_Tasks]
以获取枚举名称。我不知道这是否有帮助。 - Diullei