Az enum egy értékkészletből álló típus. Például a TypeScript rendelkezik már hasonló beépített enumokkal, ezekkel meghatározhatjuk a saját logikai típusunkat.
enum MyBoolean { false, true, }
Vagy meghatározhatjuk a színek saját típusát is:
enum Color { red, orange, yellow, green, blue, purple, }
Ezt a TypeScript kódot a erre a JavaScript kódra fordítják le (néhány részlet elhagyásra kerül a dolgok megértésének megkönnyítése érdekében):
const Color = { red: 0, orange: 1, yellow: 2, green: 3, blue: 4, purple: 5, };
Ennek a megvalósításnak számos problémája van:
Folytatva az egyszerű JavaScript-et, javíthatjuk az 1. problémát, ha karakterláncokat használunk számok helyett enum értékekként:
const Color = { red: 'red', orange: 'orange', yellow: 'yellow', green: 'green', blue: 'blue', purple: 'purple', }
Ezenkívül akkor is megkapjuk a tipizációt, ha szimbólumokat használunk enum értékekként:
const Color = { red: Symbol('red'), orange: Symbol('orange'), yellow: Symbol('yellow'), green: Symbol('green'), blue: Symbol('blue'), purple: Symbol('purple'), }
A szimbólumok egyik problémája az, hogy azokat kifejezetten karakterláncokká kell konvertálni, nem tudjuk erőltetni őket (pl. A + vagy a sablonok betűjelein belül):
assert.throws( () => console.log('Color: '+Color.red), /^TypeError: Cannot convert a Symbol value to a string$/ );
És bár tesztelhetjük a tulajdonságot, ez nem egyszerű:
function isMember(theEnum, value) { return Object.values(theEnum).includes(value); }
assert.equal(isMember(Color, Color.blue), true); assert.equal(isMember(Color, 'blue'), false);
Egyéni osztály használata az enumhoz tagsági tesztet és nagyobb rugalmasságot eredményez az enum értékeivel kapcsolatban:
class Color { static red = new Color('red'); static orange = new Color('orange'); static yellow = new Color('yellow'); static green = new Color('green'); static blue = new Color('blue'); static purple = new Color('purple'); constructor(name) { this.name = name; } toString() { return `Color.${this.name}`; } }
Az osztályok használatának ezt a módját nevezem az enum mintának. Az ihlette, hogy a maga Java hogyan építi be az enumot a nyelvbe.
További érdekességek találhatóak a következő linken: https://2ality.com/2020/01/enum-pattern.html és Java fejlesztőknek : https://howtodoinjava.com/java/enum/enum-tutorial/