【问题标题】:Cannot assign a string value to typescript enum (Initializer type string not assignable to variable type)无法将字符串值分配给打字稿枚举(初始化程序类型字符串不可分配给变量类型)
【发布时间】:2018-11-01 00:18:47
【问题描述】:

似乎从 TypeScript 2.4 开始,String Enums 是一个特性。

但是以下方法不起作用:

enum Foo {
    A = "A",
    B = "B"
}

var foo : Foo = "A";

初始化器类型字符串不可分配给变量类型 Foo

字符串文字工作:

type Foo = "A" | "B";

但如果我想要使用enum,该怎么办?有没有办法解决这个问题?

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    由于Foo 是枚举,因此您也可以使用. 来访问enum 的值,如下所示

    var foo : Foo = Foo.A;
    

    【讨论】:

      【解决方案2】:

      虽然不是直接回答问题本身(因为它不分配给枚举而是派生类型),但我发现这确实解决了我允许我分配@的问题987654322@ 并保证它是枚举的一部分,甚至允许我在真正重要的是 A 时避免多余的 A = "A"

      您可以使用keyof[1]枚举typeof上的属性枚举(Foo

      enum Foo {
          A,
          B
      }
      
      var foo : keyof typeof Foo = "A"; // OK
      var foo : keyof typeof Foo = "C"; // ERROR
      

      或者在物体上:

      interface Bar {
          type: keyof typeof Foo
      }
      
      let obj: Bar = {
          type: "A" // OK
      }
      

      [*] 我会将其他答案之一标记为已接受,并将其保留在此处以供参考

      【讨论】:

        【解决方案3】:

        如打字稿中所述enum documentation

        你可以用不同的方式使用它:

        Enum.A // Good way
        
        Enum["A"] // Bad way
        
        Enum[variable] // Good way
        

        你的情况

        enum Foo {
            A = "A",
            B = "B"
        }
        
        // Bad way
        const example1 : Foo = Foo["A"];
        
        // Good way
        const example2 : Foo = Foo.A;
        
        // Good way
        const example3 : Foo = Foo[variable];
        

        您应该避免使用example1 并专注于example2example3。无论如何,写"A"是没有意义的。

        总是更喜欢Enum.A,如果您想将变量转换为枚举,请使用Enum[variable]

        【讨论】:

          【解决方案4】:

          可以使用索引表达式来获取枚举的值:

          enum Foo {
              A = "A",
              B = "BB"
          }
          
          var foo : Foo = Foo["A"];
          var fooB : Foo = Foo["B"];
          

          请注意,键将是成员的名称,而不是值。

          你也可以使用类型断言,但是如果你分配了错误的值,你不会得到错误:

          var foo : Foo = "A"  as Foo;
          var foo : Foo = "D"  as Foo; // No error
          

          【讨论】:

          • 尽管在尝试使用这种方法使用此枚举中不存在的值时不会出现编译错误
          猜你喜欢
          • 2016-10-25
          • 2021-11-10
          • 1970-01-01
          • 2022-01-17
          • 2020-02-07
          • 2019-04-10
          • 2019-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多