【问题标题】:TypeScript enum conversion / castingTypeScript 枚举转换/强制转换
【发布时间】:2018-03-08 08:14:22
【问题描述】:

此语句失败。我怎么能从一个枚举转换成另一个(它们是相同的)

enum Enum1 {
  Key1 = 'key'
}

enum Enum2 {
  Key1 = 'key'
}

const key = Enum1.Key1
const key2 = key as Enum2

【问题讨论】:

  • 你能写下一个你需要这样做的实际用例吗?这将帮助我们更好地理解问题。
  • 我有时在多个地方定义了相同的枚举,并且由于依赖关系边界而无法从一个导入到另一个。所以我认为保持它们完全相同会让 TS 编译器高兴,但显然不是。

标签: typescript enums casting


【解决方案1】:

如果您使用数字而不是字符串作为枚举值,这将起作用:

enum Enum1 {
  Key1 = 2
}

enum Enum2 {
  Key1 = 2
}

const key = Enum1.Key1
const key2 = Enum2[Enum1[key]];

【讨论】:

    【解决方案2】:

    您可以先转换为字符串,然后再转换为所需的枚举:

    const key2 = key as string as Enum2
    

    【讨论】:

    • 请不要只发布代码作为答案,还要说明您的代码的作用以及它如何解决问题的问题。带有解释的答案通常质量更高,更有可能吸引投票
    • 虽然这可能会回答问题,但它已被标记为待审核。没有解释的答案通常被认为是低质量的。请提供一些评论,说明为什么这是正确答案。
    【解决方案3】:

    Typescript 似乎确实不会检查可能的值,所以它没有注意到这些枚举是兼容的。 我现在正在做的是

    const key2 = key as Enum1 & Enum2
    

    它并不完美,因为它不强制枚举的兼容性。 不过还是比扩大到string 或any 好。

    【讨论】:

      【解决方案4】:

      在运行时,变量将包含枚举值(在您的情况下为 key)所以您可以通过 any 进行转换,它应该可以工作

      const key = Enum1.Key1
      const key2: Enum2 = key as any
      

      【讨论】:

      • 我知道这在运行时有效。我希望找到一种编译时安全的方法来做到这一点。 (例如,如果 Enum2 def 改变了,它应该抱怨)
      • @Tony 认为没有办法用枚举来做到这一点......也许如果你不使用枚举.. 我摆弄了一些模拟枚举的类型,但允许在如果存在相同的值,则枚举,使用字符串文字
      • 是的,这似乎是解决方法 - 字符串联合而不是枚举。
      猜你喜欢
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多