Dies ist die JavaScript-Ausgabe dieser Aufzählung:
var MyEnum;
(function (MyEnum) {
MyEnum[MyEnum["First"] = 0] = "First";
MyEnum[MyEnum["Second"] = 1] = "Second";
MyEnum[MyEnum["Third"] = 2] = "Third";
})(MyEnum || (MyEnum = {}));
Welches ist ein Objekt wie dieses:
{
"0": "First",
"1": "Second",
"2": "Third",
"First": 0,
"Second": 1,
"Third": 2
}
Enum-Mitglieder mit String-Werten
TypeScript 2.4 hat die Möglichkeit hinzugefügt, dass Enums möglicherweise Werte für String-Enum-Mitglieder haben. Es ist also möglich, eine Aufzählung zu erhalten, die wie folgt aussieht:
enum MyEnum {
First = "First",
Second = 2,
Other = "Second"
}
// compiles to
var MyEnum;
(function (MyEnum) {
MyEnum["First"] = "First";
MyEnum[MyEnum["Second"] = 2] = "Second";
MyEnum["Other"] = "Second";
})(MyEnum || (MyEnum = {}));
Mitgliedsnamen abrufen
Wir können uns das Beispiel direkt oben ansehen, um herauszufinden, wie man die Enum-Mitglieder erhält:
{
"2": "Second",
"First": "First",
"Second": 2,
"Other": "Second"
}
Folgendes habe ich mir ausgedacht:
const e = MyEnum as any;
const names = Object.keys(e).filter(k =>
typeof e[k] === "number"
|| e[k] === k
|| e[e[k]]?.toString() !== k
);
Mitgliedswerte
Sobald wir die Namen haben, können wir sie durchlaufen, um den entsprechenden Wert zu erhalten, indem wir Folgendes tun:
const values = names.map(k => MyEnum[k]);
Erweiterungsklasse
Ich denke, der beste Weg, dies zu tun, besteht darin, eigene Funktionen zu erstellen (z. B. EnumEx.getNames(MyEnum)
). Sie können einer Aufzählung keine Funktion hinzufügen.
class EnumEx {
private constructor() {
}
static getNamesAndValues(e: any) {
return EnumEx.getNames(e).map(n => ({ name: n, value: e[n] as string | number }));
}
static getNames(e: any) {
return Object.keys(e).filter(k =>
typeof e[k] === "number"
|| e[k] === k
|| e[e[k]]?.toString() !== k
);
}
static getValues(e: any) {
return EnumEx.getNames(e).map(n => e[n] as string | number);
}
}
for of
Anweisung anstelle vonfor in
Mit TypeScript> = 2.4 können Sie Zeichenfolgenaufzählungen definieren:
JavaScript ES5-Ausgabe:
Welches ist ein Objekt wie dieses:
Im Fall von String-Aufzählungen müssen also keine Dinge gefiltert werden,
Object.keys(Color)
undObject.values(Color)
(*) reicht aus:Siehe Online- Beispiel auf dem TypeScript-Spielplatz
(*) Polyfill für alte Browser erforderlich, siehe https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values#Browser_compatibility
quelle
Sie können Funktionen hinzufügen, um die Namen und Indizes der Aufzählung abzurufen:
Beachten Sie, dass Sie konnten nur die Export
_names
und_indices
eher consts als sie durch eine exportierte Funktion ausgesetzt wird , sondern weil die ausgeführten Mitglieder Mitglieder der Enumeration sind , ist es wohl klarer sie als Funktionen zu haben , damit sie nicht den tatsächlichen Enum - Mitglieder sind verwirrt.Es wäre schön, wenn TypeScript so etwas automatisch für alle Aufzählungen generieren würde.
quelle
Es gibt kein Konzept für RTTI (Runtime Type Information) in TypeScript (think: Reflection). Dazu sind Kenntnisse des transpilierten JavaScript erforderlich. Angenommen, TypeScript 0.95:
wird:
Dies wird also als reguläres Objekt in Javascript modelliert, wobei
MyEnum.0 == "First"
undMyEnum.First == 0
. Um alle Aufzählungsnamen aufzulisten, müssen Sie alle Eigenschaften abrufen, die zum Objekt gehören und auch keine Zahlen sind:Ok, jetzt habe ich dir gesagt, wie es geht. Ich darf dir sagen, dass dies eine schlechte Idee ist . Sie schreiben keine verwaltete Sprache, daher können Sie diese Gewohnheiten nicht mitbringen. Es ist immer noch einfach nur altes JavaScript. Wenn ich eine Struktur in JavaScript verwenden möchte, um eine Auswahlliste zu füllen, würde ich ein einfaches altes Array verwenden. Eine Aufzählung ist hier nicht die richtige Wahl, Wortspiel beabsichtigt. Das Ziel von TypeScript ist es, idiomatisches, hübsches JavaScript zu generieren. Die Verwendung von Aufzählungen auf diese Weise bewahrt dieses Ziel nicht.
quelle
Ich habe die von David Sherret vorgeschlagene Lösung verwendet und eine npm-Bibliothek geschrieben, die Sie mit dem Namen
enum-values
...Git: Enum-Werte
quelle
Ein Einzeiler zum Abrufen einer Liste von Einträgen (Schlüsselwertobjekte / -paare):
quelle
quelle
Wenn Sie Ihrer Aufzählung Zeichenfolgenwerte zuordnen möchten, funktionieren diese Methoden nicht. Um eine generische Funktion zu haben, können Sie Folgendes tun:
Dies funktioniert, da TypeScript im ersten Schritt Schlüssel und im zweiten Schritt Werte hinzufügt.
In TypeScript ist es:
quelle
Die Antwort von Joe hat mir nur klar gemacht, dass es viel einfacher ist, sich auf die ersten N Zifferntasten zu verlassen, als komplexere Tests durchzuführen:
quelle
für nodejs:
quelle