代码之家  ›  专栏  ›  技术社区  ›  Mark

typescript中的数字枚举允许任何数字,而字符串枚举不允许

  •  2
  • Mark  · 技术社区  · 6 年前

    假设我有一个数字枚举:

    const enum EStatus {
       Busy = 0,
       Available = 1,
       Away = 2  
    }
    

    打字稿 不会 当我做以下事情时抱怨:

    const status: EStatus = 4
    

    但是,如果我有一个字符串枚举:

    const enum EDayOfWeekend {
       Saturday = "Saturday",
       Sunday = "Sunday"
    }
    

    然后TypeScript 当我试图做以下事情时,请抱怨:

    const dayOfWeekend: EDayOfWeekend = "Tuesday"
    

    我本来希望typescript既允许两者,也不允许两者都一致。IMO应该 允许使用除定义值以外的任何其他值,或者更好地强制您只能使用枚举本身初始化变量,例如。

    const dayOfWeekend = EDayOfWeekend.Saturday
    

    我想知道为什么在typescript中存在这种不一致性,以及它是否在设计中存在。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Titian Cernicova-Dragomir    6 年前

    行为差异的主要原因是能够使用标志数枚举并对其使用位运算符。对于字符串枚举,没有等效功能。在这首歌中 issue Daniel Rosenwasser明确了编译器团队的理由:

    这种行为的动机是 按位运算 . 有时候someflag.foo someflag.bar会生成另一个someflag。相反,你最终得到的是数字,你不想再回到某个标志上。 我认为,如果我们再次使用typescript,并且仍然有枚举,我们将为位标志做一个单独的构造。