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;
    }
}

Relaterade artiklar