Reputation: 760
I wrote a function returning all values of a given enum as array. The implementation works, but I have a problem with the type of the return value.
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);
I get this error:
Error:(46, 7) TS2322: Type '(typeof Foo)[]' is not assignable to type 'Foo[]'. Type 'typeof Foo' is not assignable to type 'Foo'.
How can I change the signature of getEnumValues()
in order to return the type Foo[]
here?
Upvotes: 11
Views: 7245
Reputation: 996
Personaly I do this:
enum Foo {
FOO_1 = "FOO_1",
FOO_2 = "FOO_2",
}
const fooValues:Foo[] = Object.values(Foo);
Upvotes: 0
Reputation: 249716
You need to change the definition a bit to infer the type of the enum member, right now T
will be the enum object itself (aka 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);
Note that while this works for enums, it will work for any object it is not restricted to enums
Upvotes: 13