Получение массива всех элементов из Enum в Typescript - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь получить все элементы перечисления 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;
}

Вызывая эту функцию с помощью Enum типа ExampleEnum как

export enum ExampleEnum {
 FOO,
 BAR,
 FOOBAR
}

Я ожидал возвращаемое значение от типа Array<ExampleEnum>, но ответ от типа Array<typeof ExampleEnum>.

Кто-нибудь знает, как это исправить, чтобы получить возврат от типа Array<ExampleEnum>?

(я использую TypeScript 3.2.1)

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Вы передаете объект контейнера для 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);
0 голосов
/ 12 марта 2019

Что вы думаете об этой версии функции, короче и еще обрабатывает 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']
...