Typescript lägger till metoder med dekoratörtyp existerar inte


Jag vill skapa en dekoratör som lägger till en metod till en klass.

export function Deco() {
  return function<T extends { new (...args: any[]): {} }>(constructor: T) {
    constructor.prototype.someMethod = function() {

    };
  };
}


@Deco()
class Test {

}

Problemet är när jag försöker anropa den tillagda metoden får jag TypeScript-fel:

Egenskapen someMethod finns inte på typen Test.

const test = new Test();

test.someMethod();

Hur kan jag lösa detta problem?

Svar #1

Dekoratorer kan inte påverka typens struktur. Det finns en enkel lösning på detta. Anropa dekoratorn med klassen, och inuti funktionen skapa en härledd klass med de metoder du vill ha. Resultatet av funktionen blir den nya "dekorerade" klassen och den kommer att ha alla metoder:

export function Deco() {
    return function <T extends { new(...args: any[]): {} }>(constructor: T) {
        return class extends constructor {
            someMethod() {

            }
        }
    };
}


let Test = Deco()(class {
    // Other stuff
});

const test = new Test();
test.someMethod();

Relaterade artiklar