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

11

我写了一个函数,返回给定枚举的所有值作为数组。实现是有效的,但是我遇到了返回值类型的问题。

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

我遇到了这个错误:

Error:(46, 7) TS2322: 类型 '(typeof Foo)[]' 不能赋值给类型 'Foo[]'. 类型 'typeof Foo' 不能赋值给类型 'Foo'。

我该如何更改 getEnumValues() 的签名以便在此处返回类型为 Foo[]

2个回答

13

您需要稍微修改定义以推断枚举成员的类型,现在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);

请注意,虽然这对于枚举类型有效,但它也适用于任何对象,不仅限于枚举类型。

除了不够具体之外,你也可以只更改 e:any,这样也可以工作。 - Marco
4
@Marco 嗯……你可以将任何东西键入为 any 并使其正常运行。使用 TypeScript 的技巧在于永远不要使用 any :P。此外,如果你使用 e:any,你还需要提供一个类型参数来正确地声明枚举类型(例如 getEnumValues<Foo>(Foo),这样就可以推断出枚举类型了)。 - Titian Cernicova-Dragomir
在这种情况下,它可以在不指定具体类型的情况下工作。 - Marco
1
同意。我只是在这里偷懒。 - Marco

0

个人做法是这样的:

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

const fooValues:Foo[] = Object.values(Foo);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接