Hur man använder dekoratorer på enum i TypeScript


Så här

enum Response {
    @Descriptor("this is No")
    No = 0,
    @Descriptor("this is Yes")
    Yes = 1,
}

Hur man använder dekoratorer på enum i TypeScript, jag försökte denna kod, men det fungerade inte

export function Description(description:string){
     return Reflect.metadata(descriptionMetadataKey, description);
}

Svar #1

Kort svar är att du inte kan (från och med denna skrivning). Det finns dock några alternativ.

Alternativ: Dok-kommentarer

Om du bara vill lägga till beskrivningar till dina enum-litteraler kan du använda dokumentskommentarer.

enum Response {
    /**
     * this is No
     */
    No = 0,
    /**
     * this is Yes
     */
    Yes = 1,
}

Även om beskrivningarna inte kommer att vara tillgängliga vid körning, kommer de att visas i redigerarens autokomplettering:

Alternativ: Enum-klass

Om du verkligen, verkligen behöver den dekorerade informationen om literalerna vid körning, kan du använda en klass istället. Eftersom dekoratorer kan appliceras på klassens egenskaper, kan du skriva en klass, dekorera dess egenskaper och sedan använda en instans av klassen som ditt "enum".

function Descriptor(description: string) { 
    return (target: any, propertyName: string) => {
        // process metadata ...        
    };
}

class ResponsesEnum {
    @Descriptor("this is Yes")
    readonly Yes = 1;
    @Descriptor("this is No")
    readonly No = 2;
}
const Responses = new ResponsesEnum();

Prova det här.

Svar #2

Du kan inte. Där du kan använda dekoratörer i TypeScript:

Klassdekorerare

@sealed
class Greeter {}

Metoddekorerare

class Greeter {
    @enumerable(false)
    greet() {
        return "Hello, " + this.greeting;
    }
}

Accessor-dekoratorer

class Point {
    private _x: number;

    @configurable(false)
    get x() { return this._x; }
}

Egendom Dekoratorer

class Greeter {
    @format("Hello, %s")
    greeting: string;
}

Parameterdekorerare

class Greeter {
    greet(@required name: string) {
        return "Hello " + name + ", " + this.greeting;
    }
}

Relaterade artiklar