Ist es möglich, einem Enum-Typ in TypeScript Funktionen hinzuzufügen?
zum Beispiel:
enum Mode {
landscape,
portrait,
// the dream...
toString() { console.log(this); }
}
Oder:
class ModeExtension {
public toString = () => console.log(this);
}
enum Mode extends ModeExtension {
landscape,
portrait,
}
Natürlich toString()
würde die Funktion so etwas wie ein enthalten. switch
Aber ein Anwendungsfall würde folgendermaßen verlaufen:
class Device {
constructor(public mode:Mode) {
console.log(this.mode.toString());
}
}
Ich verstehe, warum enum
es eine seltsame Sache sein kann, ein zu erweitern, und frage mich nur, ob es möglich ist.
quelle
module
jetzt istnamespace
. Ich habe auch den Hauptvorteil eines Namespace in diesem speziellen Fall hervorgehoben, nämlich die Methoden, die unter der Aufzählung erscheinen, dMode
. H.import { Mode } from "./Mode.ts"
und verwende es auf die gleiche Weise wie in Ihrem Verwendungsbeispiel - ist dies möglich, wenn Namespaces zusammengeführt werden?namespace
Ansatz möglicherweise Probleme in Funktionen verursacht, die die "Aufzählung" verbrauchen (z. B. um Aufzählungsmitglieder zu iterieren, um eine Auswahlliste zu füllen) und unerwartete Ergebnisse wie "myAddedMethod () {...}" erzeugen. Sie können fremde Nicht-Enum-Mitglieder am Iterationspunkt herausfiltern, aber nur darauf hinweisen, dass dieser Ansatz nicht ohne Nachteile ist.Sie können den Zeichenfolgenwert einer nicht konstanten Aufzählung mithilfe eckiger Klammern abrufen:
class Device { constructor(public mode:Mode) { console.log(Mode[this.mode]); } }
Sie können auch einige enumspezifische Util-Funktionen in die Enum einfügen, aber das ist genau wie bei statischen Klassenmitgliedern:
enum Mode { landscape, portrait } namespace Mode { export function doSomething(mode:Mode) { // your code here } }
quelle
import Mode = require('Mode'); ... /*more code here...*/ <Mode.landscape> landScape = Mode.landscape;
und ich habe Fehler bekommen:error TS2503: Cannot find namespace 'Mode'
Mode
ist der Typ, den Sie hier besetzen möchten und nichtlandscape
. Ändern Sie Ihre Besetzung von<Mode.landscape>
nur<Mode>
export
vor der Moduldefinition hinzufügen .Mode.doSomething(Mode.landscape);
am Ende zum Testen)export
und das Problem ist, dass TS beide Objekte entweder exportieren muss oder nicht. Entschuldigung für die Verwirrung.Konvertieren Sie Ihre
enum
in das Aufzählungsmuster. Ich finde, dass dies im Allgemeinen für viele Sprachen eine bessere Vorgehensweise ist, da Sie ansonsten die Kapselungsoptionen für Ihren Typ einschränken. Die Tendenz ist,switch
auf den Aufzählungswert zu setzen, wenn wirklich alle Daten oder Funktionen, die von dem bestimmten Aufzählungswert abhängen, nur in jede Instanz der Aufzählung eingehen sollten. Ich habe etwas mehr Code hinzugefügt, um zu demonstrieren.Dies funktioniert möglicherweise nicht, wenn Sie besonders von den zugrunde liegenden Aufzählungswerten abhängig sind. In diesem Fall müssten Sie ein Mitglied für die alten Werte hinzufügen und Orte konvertieren, die es benötigen, um die neue Eigenschaft zu verwenden.
class Mode { public static landscape = new Mode(1920, 1080); public static portrait = new Mode(1080, 1920); public get Width(): number { return this.mWidth; } public get Height(): number { return this.mHeight; } // private constructor if possible in a future version of TS constructor( private mWidth: number, private mHeight: number ) { } public GetAspectRatio() { return this.mWidth / this.mHeight; } }
quelle
Mode
Aufzählung mit diesen Werten zu verwenden. Verwenden Sie alle Werte, die für Ihr Projekt relevant sind.kann enum wie durch privaten Konstruktor und statisches get return Objekt machen
export class HomeSlideEnum{ public static get friendList(): HomeSlideEnum { return new HomeSlideEnum(0, "friendList"); } public static getByOrdinal(ordinal){ switch(ordinal){ case 0: return HomeSlideEnum.friendList; } } public ordinal:number; public key:string; private constructor(ordinal, key){ this.ordinal = ordinal; this.key = key; } public getTitle(){ switch(this.ordinal){ case 0: return "Friend List" default : return "DChat" } } }
dann kann später so verwendet werden
quelle
Eine Ergänzung zu Fentons Lösung. Wenn Sie diesen Enumerator in einer anderen Klasse verwenden möchten, müssen Sie sowohl die Aufzählung als auch den Namespace exportieren. Es würde so aussehen:
export enum Mode { landscape, portrait } export namespace Mode { export function toString(mode: Mode): string { return Mode[mode]; } }
Dann importieren Sie einfach die Datei mode.enum.ts in Ihre Klasse und verwenden sie.
quelle