【问题标题】:Why does Typescript doesn't check values number-enums?为什么 Typescript 不检查值数字枚举?
【发布时间】:2020-12-06 22:37:52
【问题描述】:

我注意到如果我有一个由数字组成的枚举,那么基本上 TypeScripts 允许将任何数字分配给这种类型的变量:

enum EnumTestA {
    foo = 1,
    baz = 2
}

const testEnum1: EnumTestA = 4;

上面的编译就好了。为什么?

如果我尝试对字符串做同样的事情:

enum EnumTestB {
    foo = "FOO",
    baz = "BAZ"
}

const testEnum2: EnumTestB = "zzz";

然后它拒绝按预期编译它。

【问题讨论】:

  • 不幸的是,支持位标志。 (如果我在其他人回答这个问题之前得到一台真正的计算机,我会详细说明)
  • @jcalz 请做。另外,有没有办法让这些数字枚举类型安全?
  • 因此他们获得了位标志的注释并牺牲了数字枚举和位标志的类型安全性。对我来说,这听起来像是一个非常糟糕的决定。你可以说 C++ 也有同样的问题,做出了更明智的决定。

标签: typescript enums


【解决方案1】:

枚举的一个常见用法是bit-flags,它本质上是只设置了一个位的数字,因此它们的按位或(单个数字)可以分解为单独的标志。如果检查了数值,则以下内容将不起作用:

enum Flags {
    FLAG1 = 1,
    FLAG2 = 2,
    FLAG3 = 4
};

const flags: Flags = Flags.FLAG1 | Flags.FLAG2;

而且它需要一个演员表,这被认为太烦人而无法处理,所以他们决定不检查数值。

【讨论】:

  • 做出这个决定的人似乎是一个非常糟糕的选择。所以他们牺牲了数字枚举的类型安全,并没有为位标志获得任何类型安全,他们获得的只是位标志的注释。如果你想要一个注释,你可以到type MyFlags = number;。我错过了这个决定的一些好处吗?可以说,C++ 在同一个十字路口走上了另一条路。
  • 这个决定主要允许命名空间中的命名常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2017-10-03
  • 2019-12-30
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多