TypeScript:从枚举类型中推断枚举值类型

Red*_*cer 6 generics enums type-inference typescript

我编写了一个函数,将给定枚举的所有值作为数组返回.实现工作,但我有一个返回值类型的问题.

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);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

错误:(46,7)TS2322:类型'(typeof Foo)[]'不能分配给'Foo []'.类型'typeof Foo'不能分配给'Foo'类型.

如何更改签名getEnumValues()才能在Foo[]此处返回类型?

Tit*_*mir 10

您需要稍微更改定义以推断枚举成员的类型,现在T将是枚举对象本身(又名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);
Run Code Online (Sandbox Code Playgroud)

请注意,虽然这适用于枚举,但它适用于不限于枚举的任何对象

  • @Marco 好吧..你可以输入任何东西作为`any`,它会起作用。使用 Typescript 的艺术从不使用 `any` :P。此外,如果你使用 `e:any`,你还必须给出一个类型参数来获得正确的枚举类型(即 `getEnumValues&lt;Foo&gt;(Foo)`,就像这样推断出来的。 (2认同)