为什么TS不使用符号作为枚举

时间:2017-01-24 09:59:56

标签: typescript enums

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吗?

1 个答案:

答案 0 :(得分:8)

ES Symbol是关于唯一性的,而TypeScript enum是关于命名常量的。 独特常量是两回事。

我们可以序列化enum结构,因为它本质上只是一个对象。但Symbol是另一回事。你不能序列化它。

因此,当我们说常量时,我​​们实际上是指使用该值,因为它正是enum提供的值。但Symbol不是您要使用的值。它更像是我们希望制作的身份,没有人能够克隆/复制。

常数是保持不变的东西。因此,一些可以在两个不同环境中运行的代码,比如Node.js和Browser,都会理解常量值是相同的(简单来说,开发人员正在为常量创建一个值,例如字符串或数字)。但是对于Symbol,想象它没有任何有价值的概念。如果我们尝试将它用作值,那么这意味着它是两个独立的东西(因为运行时正在创建那些Symbol值,而不是开发人员。)

同样,如果你使用了redux,我们更喜欢string而不是Symbol代表我们的行动。

此外,in case of TypeScriptenum也可用作ambientsubstitution值。在这种情况下,它是枚举值重要的唯一编译器。在编译期间,type erasure可能会完全删除enum引用。现在,这是使用Symbol无法做到的事情。创建Symbol仅是运行时活动。因此,如果我们将Symbol用于enum,那么我们将失去enum 仅编译时功能的能力。

因此,Symbol不使用enum似乎是一个明智的选择。