【问题标题】:TypeScript enum key - string is not assignable to type EnumTypeScript 枚举键 - 字符串不可分配给 Enum 类型
【发布时间】:2021-10-01 04:54:11
【问题描述】:

我正在尝试将 typescript 与 graphql 一起使用,他们的枚举系统让我有些头疼。我正在使用数字索引枚举,但没有在 ts 枚举上指定值,例如:

enum Enum { A }

因为 graphql 枚举不能有数字,所以我有一个自定义解析器来将字符串值转换为相应的索引。为了测试我想要做的是:

const a: Enum = Enum[Enum.A]

但是,我收到以下错误:

Type 'string' is not assignable to type 'Enum'.(2322)

我有点理解背后的逻辑,因为在[] 中我可以将不存在的密钥放在枚举上,但密钥本身就是枚举本身,所以它应该有足够的信心返回枚举,而不仅仅是字符串。而且因为Object.values(Enum)同时返回键和值,所以获取键应该仍然是枚举。

有什么解决方法吗?

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    这段代码:

    enum Enum { A }
    

    编译为:

    var Enum;
    (function (Enum) {
        Enum[Enum["A"] = 0] = "A";
    })(Enum || (Enum = {}));
    

    然后编译为

    {
      0:'A'
     'A':0
    }
    

    因此,这段代码:

    const a: Enum = Enum[Enum.A]
    

    字面意思是这样的:

    const a: Enum = Enum[0]
    

    因此,上面的代码编译为:

    const a: Enum = 'A'
    

    字符串A 不可分配给枚举,因为您的enum 是数字。

    就个人而言,我认为您应该避免使用数字枚举,并使用enum Foo {A='A'}

    【讨论】:

    • 我也不喜欢它们,但是猫鼬不支持自定义排序功能。所以像状态这样的字段,值的排名,我不得不将它们编码为数字。但是,您的回答对我来说仍然没有使“啊啊”有意义。如果枚举不会被编号,而是A = 'A',而不是A[0],我得到A['A'],它仍然是一个字符串。
    • 你也可以使用不可变对象。喜欢:const obj={A:0} as const
    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2018-11-01
    • 2023-02-15
    • 2021-08-19
    • 2018-06-24
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多