TypeScript: вывод значения типа enum из типа enum

Я написал функцию, возвращающую все значения заданного перечисления в виде массива. Реализация работает, но у меня есть проблема с типом возвращаемого значения.

enum Foo {
    FOO_1 = "FOO_1",
    FOO_2 = "FOO_2",
}

function getEnumValues<T>(e:T): T[] {
    let keys: string[] = Object.keys(e);
    keys = keys.filter(key => e[key] !== undefined);
    return keys.map(key => e[key]);
}

const fooValues:Foo[] = getEnumValues(Foo);

Я получаю эту ошибку:

Ошибка:(46, 7) TS2322: Тип '(typeof Foo)[]' нельзя назначить типу 'Foo[]'. Тип typeof Foo нельзя назначить типу Foo.

Как я могу изменить подпись getEnumValues() чтобы вернуть тип Foo[] Вот?

2 ответа

Вам нужно немного изменить определение, чтобы определить тип члена enum прямо сейчас T будет сам объект enum (иначе typeof T)

enum Foo {
    FOO_1 = "FOO_1",
    FOO_2 = "FOO_2",
}

function getEnumValues<TEnum, TKeys extends string>(e: { [key in TKeys]: TEnum }): TEnum[] {
    let keys = Object.keys(e) as Array<TKeys>;
    keys = keys.filter(key => e[key] !== undefined);
    return keys.map(key => e[key]);
}

const fooValues: Foo[] = getEnumValues(Foo);

Обратите внимание, что хотя это работает для перечислений, оно будет работать для любого объекта, которое не ограничено перечислениями

Лично я делаю так:

      enum Foo {
    FOO_1 = "FOO_1",
    FOO_2 = "FOO_2",
}

const fooValues:Foo[] = Object.values(Foo);
Другие вопросы по тегам