TypeScript 枚举键 - 字符串不可分配给类型 Enum

时间:2021-07-24 11:56:36

标签: typescript enums

我正在尝试将 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) 会同时返回键和值,所以获取键仍然应该是枚举。

是否有任何解决方法?

1 个答案:

答案 0 :(得分:1)

此代码:

enum Enum { A }

编译为:

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

依次编译为

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

enter image description here

因此,此代码:

const a: Enum = Enum[Enum.A]

字面意思是:

const a: Enum = Enum[0]

相应地,上面的代码编译为:

const a: Enum = 'A'

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

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