A JavaScript library that helps with the enum pattern. Also supports TypeScript.
Installation:
npm install enumify
class Color extends Enumify {
static red = new Color();
static orange = new Color();
static yellow = new Color();
static green = new Color();
static blue = new Color();
static purple = new Color();
static _ = this.closeEnum(); // TypeScript: Color.closeEnum()
}
// Instance properties
assert.equal(
Color.red.enumKey, 'red');
assert.equal(
Color.red.enumOrdinal, 0);
// Prototype methods
assert.equal(
'Color: ' + Color.red, // .toString()
'Color: Color.red');
// Static `.enumKeys` and static `.enumValues`
assert.deepEqual(
Color.enumKeys,
['red', 'orange', 'yellow', 'green', 'blue', 'purple']);
assert.deepEqual(
Color.enumValues,
[ Color.red, Color.orange, Color.yellow,
Color.green, Color.blue, Color.purple ]);
// Static `.enumValueOf()`
assert.equal(
Color.enumValueOf('yellow'),
Color.yellow);
// Iterability
const result = [];
const iterated = [...Color];
for (const c of Color) {
result.push('Color: ' + c);
}
assert.deepEqual(
iterated, [
Color.red,
Color.orange,
Color.yellow,
Color.green,
Color.blue,
Color.purple,
]);
See:
ts/test/index_test.ts
ts/test/state.ts
Run tests like this (after compiling TypeScript, e.g. via npm run build
):
npm t dist/test/index_test.js
The enum pattern and Enumify are based on public static fields. Support for them currently looks as follows:
- MDN lists support for public static fields in various JavaScript engines.
- Babel has the plugin
plugin-proposal-class-properties
for public static fields. - TypeScript has supported static fields in classes for a very long time.