Ich mag würde nennen eine ENUM-ähnliche Struktur in JS definieren, hat aber zwei Voraussetzungen:ES6 read-only Aufzählungen, den Wert zuordnen kann
- Die Werte nur gelesen werden, dh keine Benutzer zuordnen zu ihnen.
- Die Werte (0, 1, 2, ...) zurück in die Namen zugeordnet werden (wie bei Java name method)
Die Methoden Ich weiß Aufzählungen wie diese erstellen typischerweise eine Anforderung erfüllen oder die andere, nicht beide.
Ich habe versucht:
const MyEnum = {
a: 0,
b: 1,
c: 2
};
ENUM selbst konstant ist, aber die Werte sind immer noch wandelbar und ich kann nicht Werte abbilden zurück effizient Namen.
Wenn ein enum
in Typoskript zu schreiben, gibt sie:
var MyEnum;
(function (MyEnum) {
MyEnum[MyEnum["a"] = 0] = "a";
MyEnum[MyEnum["b"] = 1] = "b";
MyEnum[MyEnum["c"] = 2] = "c";
})(MyEnum || (MyEnum = {}));
Diese beiden Möglichkeiten abbilden kann, aber immer noch nicht konstante Werte hat.
Die einzige Option, die ich gefunden habe, die auf eine Klasse mit Getter würde beide Anforderungen erfüllt:
class MyEnum {
get a() {
return 0;
}
...
}
Diese Methode dramatisch die rechtlichen Namen beschränkt und hat eine Menge Aufwand, vor allem in Browsern, die don‘ t inline getters gut (oder kann nicht).
@Shmiddty suggested freezing an object:
const MyEnum = Object.freeze({
a: 0,
b: 1,
c: 2
});
Dies erfüllt die ständige Anforderung gut, aber keine Werte eine gute Möglichkeit bieten zurück auf Namen abzubilden.
Ich kann einen Helfer schreiben, die die umgekehrte Abbildung wie baut:
function reverseEnum(enum) {
Object.keys(enum).forEach(k => {
enum[enum[k]] = k;
});
}
Aber jede Art von programmatischer Lösung, um die umgekehrte Zuordnung zu generieren auf Probleme stoßen, wenn das ursprüngliche Objekt eingefroren ist oder auf andere Weise tatsächlich konstant.
Gibt es eine saubere, prägnante Lösung in JS?
Warum nicht die Enumeration erstellen, umgekehrte Eigenschaften hinzufügen und * dann * einfrieren? Nichtsdestotrotz kann ich den Wunsch, dies prägnant zu tun, schätzen. – apsillers
@apsillers, das ist eine ziemlich gute Idee. Definieren Sie ein normales const-enum-Objekt, und führen Sie dann einen Helfer aus, der die umgekehrte Zuordnung einrichtet und einfriert. Ich kann einen Anruf leicht genug aufrechterhalten, so dass das ziemlich gut funktioniert. Willst du es in eine Antwort verwandeln? – ssube
Wird der spezifische Wert auch benötigt? Ich würde wahrscheinlich auch alle Werte mit Symbol symbolisieren, aber ich weiß nicht, was Sie erwarten. Normalerweise sind Enum-Werte nicht wirklich wichtig, zumindest in Code, den ich schreibe. – loganfsmyth