ES6符号非常适合枚举,因为它们可以避免碰撞。我认为如果enum
,TS target:'es6'
类型使用符号作为枚举,但它没有:
enum Role {Employee, Manager, Admin}
let role: Role = Role.Employee;
转化为
var Role;
(function (Role) {
Role[Role["Employee"] = 0] = "Employee";
Role[Role["Manager"] = 1] = "Manager";
Role[Role["Admin"] = 2] = "Admin";
})(Role || (Role = {}));
let role = Role.Employee;
任何想法为什么?使用此类方法Role.Employee
的值为0
,在运行时可以使用值0
的任何其他枚举代替Role.Employee
吗?
答案 0 :(得分:8)
ES Symbol
是关于唯一性的,而TypeScript enum
是关于命名常量的。 独特和常量是两回事。
我们可以序列化enum
结构,因为它本质上只是一个对象。但Symbol
是另一回事。你不能序列化它。
因此,当我们说常量时,我们实际上是指使用该值,因为它正是enum
提供的值。但Symbol
不是您要使用的值。它更像是我们希望制作的身份,没有人能够克隆/复制。
常数是保持不变的东西。因此,一些可以在两个不同环境中运行的代码,比如Node.js和Browser,都会理解常量值是相同的(简单来说,开发人员正在为常量创建一个值,例如字符串或数字)。但是对于Symbol
,想象它没有任何有价值的概念。如果我们尝试将它用作值,那么这意味着它是两个独立的东西(因为运行时正在创建那些Symbol
值,而不是开发人员。)
同样,如果你使用了redux,我们更喜欢string
而不是Symbol
代表我们的行动。
此外,in case of TypeScript,enum
也可用作ambient
或substitution
值。在这种情况下,它是枚举值重要的唯一编译器。在编译期间,type erasure
可能会完全删除enum
引用。现在,这是使用Symbol无法做到的事情。创建Symbol
仅是运行时活动。因此,如果我们将Symbol
用于enum
,那么我们将失去enum
仅编译时功能的能力。
因此,Symbol
不使用enum
似乎是一个明智的选择。