TypeScript agregar métodos con decorador tipo no existe
Quiero crear un decorador que agregue un método a una clase.
export function Deco() {
return function<T extends { new (...args: any[]): {} }>(constructor: T) {
constructor.prototype.someMethod = function() {
};
};
}
@Deco()
class Test {
}
El problema es que cuando intento invocar el método agregado, obtengo un error de TypeScript:
La propiedad someMethod no existe en el tipo Test.
const test = new Test();
test.someMethod();
¿Cómo puedo resolver este problema?
Respuesta #1
Los decoradores no pueden influir en la estructura del tipo. Hay una solución simple para esto. Invoca el decorador con la clase y, dentro de la función, crea una clase derivada con los métodos que deseas. El resultado de la función será la nueva clase "decorada" y tendrá todos los métodos:
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();
