Typescript-dekoratorns konstruktoröverskrivning inklusive ytterligare argument
Enligt dokumentationen om TypeScript-dekoratorer skickar dekoatorexemplet för att ersätta en konstruktor inga argument till dekoratorfunktionen. Hur kan jag uppnå detta?
Detta är vad doktorn säger
function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
return class extends constructor {
newProperty = "new property";
hello = "override";
}
}
@classDecorator
class Greeter {
property = "property";
hello: string;
constructor(m: string) {
this.hello = m;
}
}
Men jag vill nu skicka argument som att använda dekoratören på följande sätt
@classDecorator({
// some object properties fitting DecoratorData type
})
Jag försökte helt enkelt lägga till en andra dataparameter
function classDecorator<T extends {new(...args:any[]): {}}>(constructor: T, data: DecoratorData)
Men detta är bara tslint 2 argument krävs, fick 1. Att sätta in en null-platshållare fungerar inte heller. Jag försökte också använda constructor-parametern som en andra valfri parameter. Detta leder till ett signaturfel.
Svar #1
Du behöver använda en dekoratorgenerator, en funktion som returnerar en dekoratorfunktion. Generatorfunktionen kan ta extra argument, och den inre dekoratorfunktionen kan fånga dessa parametrar och använda dem.
function classDecorator(data: DecoratorData) {
return function <T extends { new(...args: any[]): {} }>(constructor: T) {
return class extends constructor {
newProperty = "new property";
hello = "override";
// use daat here
}
}
}
@classDecorator({ data: "" })
class Greeter {
property = "property";
hello: string;
constructor(m: string) {
this.hello = m;
}
}
