从打字稿中的枚举中获取所有项的数组

时间:2019-03-11 08:16:10

标签: angular typescript enumeration

我正在尝试获取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)

2 个答案:

答案 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']
相关问题