TypeScript 的枚举是许多其他语言中的一个非常方便的功能。然而,JavaScript 目前还没有类似的概念。但是 JavaScript 在语法糖方面的不足之处在于它在灵活性方面得到了弥补。
定义枚举的最简单方法是Object.freeze()
与普通对象结合使用。这将确保枚举对象不会发生变异。
const daysEnum = Object.freeze({
monday: 0,
tuesday: 1,
wednesday: 2,
thursday: 3,
friday: 4,
saturday: 5,
sunday: 6
});
更进一步,可以将逻辑提取到具有可变数量参数的函数中并生成冻结对象。这种技术几乎没有什么好处,所以更好的选择是创建一个简单的class
. 毕竟,枚举在面向对象的编程语言中更常见,所以这听起来很合适。
一个Enum
类只需要constructor
具有可变数量的参数。它的工作是将每个键添加到枚举对象并冻结新创建的实例。一个潜在的改进是提供对枚举值作为字符串的访问。显然,这可以使用 来完成Object.keys()
,但是命名方法可能会导致与枚举值之一发生冲突,更不用说污染结果的方法了。
在这里使用 ES6 符号是显而易见的解决方案,因为它不会污染结果,Object.keys()
也不会与枚举中的任何值冲突。更进一步,Symbol.iterator
将是一个不错的选择,因为它允许枚举被认为是可迭代的,并使其更加有用。将所有这些放在一起,这是我的Enum
课程以及如何使用它:
class Enum {
constructor(...keys) {
keys.forEach((key, i) => {
this[key] = i;
});
Object.freeze(this);
}
*[Symbol.iterator]() {
for (let key of Object.keys(this)) yield key;
}
}
const daysEnum = new Enum(
'monday',
'tuesday',
'wednesday',
'thursday',
'friday',
'saturday',
'sunday'
);
const days = [...daysEnum]; // Array of the enum values as strings