【问题标题】:Why doesn't TS use Symbols for enums为什么 TS 不将符号用于枚举
【发布时间】:2017-06-09 01:45:34
【问题描述】:

ES6 符号非常适合枚举,因为它们可以避免冲突。我认为 TS enum 类型在 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 使用吗?

【问题讨论】:

标签: typescript enums


【解决方案1】:

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 似乎是一个明智的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多