Website-Suche

javascript - Den Klassennamen eines Enums in Typescript erhalten


Ich habe einige Enums in meiner Typescript-Anwendung und ich verwende einen Code ähnlich diesem, um den Zeichenfolgenwert zu erhalten, der in der Anwendung angezeigt werden soll:

enum Color{ RED, BLUE, GREEN};

document.write( "The string for Red is: " + Color[Color.RED] );

Der String-Wert ist jedoch normalerweise eher eine Art Datenbankschlüssel oder ein anderer serverbezogener String als ein schön formatierter String, der für die Anzeige für den Benutzer geeignet ist. Um dies zu umgehen, möchte ich lokalisierte Property-Dateien laden, die den String-Wert eines Enums verwenden, um einen schön formatierten String für die Anzeige in der Anwendung nachzuschlagen. Die Datei könnte so aussehen:

Color.properties:
RED=The color is red
BLUE=The color is blue
GREEN=The color is green

Ich bin zuversichtlich, dass ich diese Datei laden und den Inhalt analysieren kann, um später ein Nachschlagewerk für die Anzeige in der Anwendung zu erstellen, aber ich bin mir nicht sicher, wie ich wissen kann, welche Eigenschaften-Datei geladen werden soll. Für die folgenden Enums

Color
Shape
Animal

Ich werde die folgenden Eigenschaftsdateien haben:

Color.properties
Shape.properties
Animal.properties

Meine Frage ist: Gibt es eine Möglichkeit, den String „Color“ aus der zur Laufzeit vorhandenen JavaScript-Definition von Color zu erhalten? Der TypeScript-Code für Color wird folgendermaßen in JavaScript transpiliert:

var Color;
(function (Color) {
    Color[Color["RED"] = 0] = "RED";
    Color[Color["BLUE"] = 1] = "BLUE";
    Color[Color["GREEN"] = 2] = "GREEN";
})(Color || (Color = {}));

Ich glaube nicht, dass ich den String Color daraus auf irgendeine einfache Weise herausbekommen kann. Ich nehme an, dass ich einfach den Switch-Ausdruck verwenden muss, um den Namen der Datei nachzuschlagen.

Antwort #1

Nein, es gibt nichts, das in die Sprache eingebaut ist und es dir erlaubt, den Namen eines Enums zur Laufzeit zu erhalten.

Ich habe jedoch die folgende Methode verwendet, um es zu tun:

namespace MyEnums {

    export enum Color { RED, BLUE, GREEN };

    export enum Shape { ROUND, SQUARE };

    export function getName(enumObj: any): string {

        for (let name in MyEnums) {
            if ( MyEnums[name] === enumObj && MyEnums.hasOwnProperty(name) ) {
                return name;
            }
        }

        return undefined;
    }
}

const Color = MyEnums.Color;

var name = MyEnums.getName(Color);

Obwohl ich schließlich meinen Code umgeschrieben habe, sodass ich am Ende die Namen nicht mehr abrufen musste.

Antwort #2

Es könnte einfacher sein, die Datei, in der Sie Ihre Zeichenfolgen speichern, zu einer TypeScript-Datei zu machen und dann das eigentliche Enum—Color—zu verwenden, um die Zuordnung vorzunehmen.

Damit gesagt...

Gibt es eine Möglichkeit, den String "Color" aus der zur Laufzeit definierten JavaScript-Definition von Color zu erhalten?

Eine verlässliche Lösung ist, etwas wie ts-nameof zu verwenden.

Alternativ können Sie einen ähnlichen Trick verwenden, der in dieser Antwort erläutert wird:

function getVariableName(variableFunction: () => any) {
    return /\s([^\s;]+);?\s*\}$/.exec(variableFunction.toString())[1];
}

var variableName = getVariableName(() => Color); // returns string "Color"

Dies verpackt Color in eine Funktion und ruft dann .toString() auf dieser Funktion auf. Mit diesem String wird nur der angegebene Name extrahiert.

Stellen Sie einfach sicher, dass Sie testen, ob dies nach der Minifizierung funktioniert.

Verwandte Artikel