我知道这个问题被问了十亿遍,但我仍然不明白枚举是如何工作的。
例如,我得到了简单的枚举
export enum Type {
Null,
First,
Second,
Third
}
现在的问题是,这些代码之间有什么区别
if (myObject.type === 2) doStuff();
还有一个:
if (myObject.type === Type.Second) doStuff();
我正在从后端获取myObject
,我需要检测该对象类型以运行某些功能,为什么我应该使用枚举类型来做到这一点
也许我错了,但是我的示例做的事情完全相同
能否请您解释一下我为什么要在示例中使用枚举类型
答案 0 :(得分:3)
您是正确的,他们使用纯Javascript正在做同样的事情。 TypeScript为您提供额外的安全性,以防将来您的代码更改。
想象一下,您有时会在枚举中添加一个新元素。可能是null和first之间的第零个元素。现在Type.Second等于3,而对=== 2的检查将不再正确。通过持续使用枚举,可以避免将来出现这些错误。
答案 1 :(得分:2)
这两段代码的作用相似。 Type.Second
将包含与枚举成员相关联的数字,而type
(假定其键入为Type
)应包含一个枚举成员,因此在运行时应为数字。这意味着在这两种情况下,您都在比较数字,只是在第二种情况下,值是内联的,而在第一种情况下,值是来自对象成员的访问。
现在从服务器上不返回数字,但返回枚举的名称,没有人能按预期工作。
还请注意,尽管这不是一个好主意,但是您可以修改枚举对象的运行时值,这可能会导致意外结果:
(Type as any)["Second"] = 10
如果您希望两者完全相同(即两种情况下的编译代码都相同),则可以使用const enum
。 const 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
}
因此,很明显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]
。
您能否向我解释为什么我应该在示例中使用枚举类型?
一些常见原因是:
"Second"
export enum Type {
Null,
First,
Second = 3, /// now it's 3
Third
}