我正在尝试获取TypeScript枚举的所有项目。为此,我使用以下通用函数:
static getAllValues<T>(enumeration: T): Array<T>{
let enumKeys: Array<T> = Object.keys(enumeration).map(k => enumeration[k]);
let items: Array<T> = new Array<T>();
for(let elem of enumKeys){
if (typeof(elem) === "number"){
items.push(elem)
}
}
return items;
}
通过使用类型为ExampleEnum
的枚举来调用此函数,如
export enum ExampleEnum {
FOO,
BAR,
FOOBAR
}
我希望返回类型为Array<ExampleEnum>
的返回值,但是响应来自类型为Array<typeof ExampleEnum>
的返回值。
有人知道如何解决它,以从Array<ExampleEnum>
类型获得回报吗?
(我正在使用TypeScript 3.2.1)
答案 0 :(得分:1)
您正在传递enum
的容器对象,因此T
将成为容器对象。容器对象与枚举类型不同,它是一个包含枚举值的对象,因此其值将是枚举类型,我们可以使用T[keyof T]
function getAllValues<T>(enumeration: T): Array<T[keyof T]> {
let enumKeys = Object.keys(enumeration).map(k => enumeration[k]);
let items = new Array<T[keyof T]>();
for (let elem of enumKeys) {
if (typeof (elem) === "number") {
items.push(elem as any)
}
}
return items;
}
export enum ExampleEnum {
FOO,
BAR,
FOOBAR
}
getAllValues(ExampleEnum);
答案 1 :(得分:0)
您如何看待此版本的功能,它简短但仍在处理string enum
?
function enumValues<T extends object>(enumeration: T): Array<T[keyof T]> {
return Object
.keys(enumeration)
.filter(k => isNaN(Number(k)))
.map(k => enumeration[k]);
}
enum ExampleEnum {
FOO = 10,
BAR = 20,
BAZ = 30
}
console.log(enumValues(ExampleEnum)); // [10, 20, 30]
enum ExampleStringEnum {
FOO = 'F',
BAR = 'B',
BAZ = 'Z'
}
console.log(enumValues(ExampleStringEnum)); // ['F', 'B', 'Z']