枚举打字稿

时间:2019-01-10 07:42:49

标签: angular typescript enums

我知道这个问题被问了十亿遍,但我仍然不明白枚举是如何工作的。
例如,我得到了简单的枚举

export enum Type { 
  Null,
  First, 
  Second,
  Third
}

现在的问题是,这些代码之间有什么区别

if (myObject.type === 2) doStuff();

还有一个:

if (myObject.type === Type.Second) doStuff();

我正在从后端获取myObject,我需要检测该对象类型以运行某些功能,为什么我应该使用枚举类型来做到这一点
也许我错了,但是我的示例做的事情完全相同
能否请您解释一下我为什么要在示例中使用枚举类型

3 个答案:

答案 0 :(得分:3)

您是正确的,他们使用纯Javascript正在做同样的事情。 TypeScript为您提供额外的安全性,以防将来您的代码更改。

想象一下,您有时会在枚举中添加一个新元素。可能是null和first之间的第零个元素。现在Type.Second等于3,而对=== 2的检查将不再正确。通过持续使用枚举,可以避免将来出现这些错误。

答案 1 :(得分:2)

这两段代码的作用相似。 Type.Second将包含与枚举成员相关联的数字,而type(假定其键入为Type)应包含一个枚举成员,因此在运行时应为数字。这意味着在这两种情况下,您都在比较数字,只是在第二种情况下,值是内联的,而在第一种情况下,值是来自对象成员的访问。

现在从服务器上不返回数字,但返回枚举的名称,没有人能按预期工作。

还请注意,尽管这不是一个好主意,但是您可以修改枚举对象的运行时值,这可能会导致意外结果:

 (Type as any)["Second"] = 10

如果您希望两者完全相同(即两种情况下的编译代码都相同),则可以使用const enumconst enums不使用运行时对象,所有memeer引用均被枚举的实际值替换:

export const enum Type { 
  Null,
  First, 
  Second,
  Third
}

if (myObject.type === Type.Second) doStuff();
// Compiled to 

if (myObject.type === 2 /* Second */)
    doStuff

答案 2 :(得分:2)

值得一看您的打字稿中的枚举的已编译javascript:

[NSPrintOperation printOperationWithView:webView]

它大致编译为:

export enum Type { 
  Null,
  First, 
  Second,
  Third
}

Try in playground

因此,很明显var Type = {}; Type[Type["Null"] = 0] = "Null"; Type[Type["First"] = 1] = "First"; Type[Type["Second"] = 2] = "Second"; Type[Type["Third"] = 3] = "Third"; 将产生数字Type.Second,而2将返回Type[2]

  

您能否向我解释为什么我应该在示例中使用枚举类型?

一些常见原因是:

  1. 更具可读性
  2. 如果有人更改枚举,您不会破坏代码:

"Second"

export enum Type { 
    Null,
    First, 
    Second = 3, /// now it's 3
    Third
}
  1. 因此,您的代码变得更加可靠和可维护