从 Typescript 中的枚举中获取所有项目的数组

Getting an Array of all items from an Enum in Typescript

我正在尝试获取 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> 类型的 return 值,但响应来自 Array<typeof ExampleEnum>.

类型

有谁知道如何修复它,从类型 Array<ExampleEnum> 得到 return?

(我使用的是 TypeScript 3.2.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);

您如何看待这个版本的函数,它更短而且还在处理 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']