【问题标题】:TypeScript: Infer enum value type from enum typeTypeScript:从枚举类型推断枚举值类型
【发布时间】:2018-10-18 00:41:16
【问题描述】:

我编写了一个函数,将给定枚举的所有值作为数组返回。实现是可行的,但是我对返回值的类型有疑问。

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: Type '(typeof Foo)[]' is notassignable to type 'Foo []'。类型 'typeof Foo' 不能分配给类型 'Foo'。

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

【问题讨论】:

    标签: typescript generics enums type-inference


    【解决方案1】:

    您需要稍微更改定义以推断枚举成员的类型,现在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 well .. 你可以输入任何内容为any,它会起作用。使用 Typescript 的艺术从不使用 any :P。此外,如果您使用e:any,您还必须提供一个类型参数以具有正确的枚举类型(即getEnumValues&lt;Foo&gt;(Foo),就像这样推断出来的。
    • 它确实可以在不指定具体类型的情况下工作——至少在这种情况下是这样。
    • 同意。我只是在这里偷懒。
    【解决方案2】:

    我个人是这样做的:

    enum Foo {
        FOO_1 = "FOO_1",
        FOO_2 = "FOO_2",
    }
    
    const fooValues:Foo[] = Object.values(Foo);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-05
      • 2017-01-14
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2019-12-30
      相关资源
      最近更新 更多