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
在运行时?
ES Symbol
是关于唯一性的,而TypeScript enum
是关于命名常量的.作为独特的并且是恒定的是两个不同的东西.
我们可以序列化enum
结构,因为它本质上只是一个对象.但这Symbol
是一个不同的故事.你无法序列化它.
因此,当我们说恒定时,我们实际上意味着使用该值,正如它所enum
提供的那样.但这Symbol
不是您想要使用的值.它更像是我们希望制作的身份,没有人能够克隆/复制.
常数是保持不变的东西.因此,一些可以在两个不同环境中运行的代码,比如Node.js和Browser,都会理解常量值是相同的(简单来说,开发人员正在为常量创建一个值,例如字符串或数字).但是Symbol
,想象一下,它没有任何有价值的概念.如果我们尝试将它用作值,那么这意味着它是两个独立的东西(因为运行时正在创建这些Symbol
值,而不是开发人员).
在相同的光,如果你已经使用终极版,我们宁愿string
在Symbol
代表我们的行动.
此外,在TypeScript的情况下,enum
也可以用作ambient
或substitution
值.在这种情况下,它是枚举值重要的唯一编译器.在编译期间,type erasure
可以enum
完全删除引用.现在,这是使用Symbol无法做到的事情.创建Symbol
仅运行时活动.因此,如果我们使用Symbol
了enum
,那么我们失去的能力enum
是编译时只功能.
因此,不使用Symbol
的enum
似乎是一个明智的选择.