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);