Enums en Javascript avec ES6

je suis en train de reconstruire un vieux projet Java en Javascript, et j'ai réalisé qu'il n'y avait pas de bonne façon de faire des enums en JS.

Le mieux que je puisse vous arriver, c'est:

const Colors = {
    RED: Symbol("red"),
    BLUE: Symbol("blue"),
    GREEN: Symbol("green")
};
Object.freeze(Colors);

le const empêche Colors d'être réassigné, et le gel empêche la mutation des clés et des valeurs. J'utilise des symboles pour que Colors.RED ne soit pas égal à 0 , ou quoi que ce soit d'autre.

est-il un le problème avec cette formulation? Est-il un meilleur moyen?


(je sais que cette question est un peu répétitive, mais toutes les questions précédentes sont assez anciennes, et ES6 nous donne de nouvelles capacités.)


modifier:

une autre solution, qui traite du problème de sérialisation, mais je crois a encore des problèmes de Royaume:

const enumValue = (name) => Object.freeze({toString: () => name});

const Colors = Object.freeze({
    RED: enumValue("Colors.RED"),
    BLUE: enumValue("Colors.BLUE"),
    GREEN: enumValue("Colors.GREEN")
});

en utilisant les références d'objet comme valeurs, vous obtenez le même évitement de collision que les symboles.

60
demandé sur Eric the Red 2017-06-09 04:19:14

8 réponses

y a-t-il un problème avec cette formulation?

Je n'en vois pas.

y a-t-il un meilleur moyen?

Je réduirais les deux déclarations en une seule:

const Colors = Object.freeze({
    RED:   Symbol("red"),
    BLUE:  Symbol("blue"),
    GREEN: Symbol("green")
});

si vous n'aimez pas le boilerplate, comme les appels répétés Symbol , vous pouvez bien sûr aussi écrire une fonction helper makeEnum qui crée la même chose à partir d'une liste de nom.

65
répondu Bergi 2017-06-09 01:45:50

vérifier aussi énumérer , une bibliothèque très bonne et bien décrite pour ES6 enums.

J'espère que cela aidera quelqu'un.

meilleures salutations,

Emmanuel

3
répondu Emmanuel.B 2018-02-24 19:58:07

comme mentionné ci-dessus, vous pouvez aussi écrire un makeEnum() fonction d'aide:

function makeEnum(arr){
    let obj = {};
    for (let val of arr){
        obj[val] = Symbol(val);
    }
    return Object.freeze(obj);
}

utilisez - le comme ceci:

const Colors = makeEnum(["red","green","blue"]);
let startColor = Colors.red; 
console.log(startColor); // Symbol(red)

if(startColor == Colors.red){
    console.log("Do red things");
}else{
    console.log("Do non-red things");
}
3
répondu tonethar 2018-04-07 16:50:18

Vérifier comment Tapuscrit t-il . Fondamentalement, ils font ce qui suit:

const MAP = {};

MAP[MAP[1] = 'A'] = 1;
MAP[MAP[2] = 'B'] = 2;

MAP['A'] // 1
MAP[1] // A

utilisez les symboles, bloquez l'objet, tout ce que vous voulez.

3
répondu givehug 2018-10-03 10:22:08

si vous n'avez pas besoin de pur ES6 et pouvez utiliser le typographie, il a une belle enum :

https://www.typescriptlang.org/docs/handbook/enums.html

0
répondu Chris Halcrow 2018-08-01 01:42:26

vous pouvez également utiliser le paquet es6-enum ( https://www.npmjs.com/package/es6-enum ). Il est très facile à utiliser. Voir l'exemple ci-dessous

-1
répondu Fawaz 2018-03-30 21:26:57

vous pouvez utiliser la carte ES6

const colors = new Map([
  ['RED', 'red'],
  ['BLUE', 'blue'],
  ['GREEN', 'green']
]);

console.log(colors.get('RED'));
-1
répondu Valentin Micu 2018-09-11 13:23:14

C'est mon approche personnelle.

class ColorType {
    static get RED () {
        return "red";
    }

    static get GREEN () {
        return "green";
    }

    static get BLUE () {
        return "blue";
    }
}

// Use case.
const color = Color.create(ColorType.RED);
-1
répondu Vasile Alexandru Peşte 2018-10-02 22:01:40