Un Class Decorator (Decorador de Clase) es declarado justamente antes de la clase. La clase decorator es aplicada al constructor de la clase, y puede ser utilizado para observar, modificar o reemplazar la definición de una clase.
export function cambiarNombre(_nombre: string) {
return function <T extends { new (...args: any[]): {} }>(constructor: T) {
return class extends constructor {
nombre = _nombre;
};
};
}
export function cambiarAlias(_alias: string) {
return function <T extends { new (...args: any[]): {} }>(constructor: T) {
return class extends constructor {
alias = _alias;
};
};
}
export function cambiarEdad(_edad: number) {
return function <T extends { new (...args: any[]): {} }>(constructor: T) {
return class extends constructor {
edad = _edad;
};
};
}
Si ejecutamos el siguiente bloque…
class usuario {
constructor(
public nombre: string,
public alias: string,
public edad: number
) {}
saludar() {
console.log(`Mi nombre es ${this.nombre}`);
console.log(`me dicen ${this.alias}`);
console.log(`y tengo ${this.edad} años`);
}
}
const u1 = new usuario("Roberto", "Robert", 19);
u1.saludar();
La salida será…
Mi nombre es Roberto
me dicen Robert
y tengo 19 años
Pero si aplicamos los decoradores, estos reescribirán los valores enviados al constructor.
import { cambiarAlias, cambiarEdad, cambiarNombre } from "./cambiarNombre";
@cambiarNombre("Francisco")
@cambiarAlias("Paco")
@cambiarEdad(20)
class usuario {
constructor(
public nombre: string,
public alias: string,
public edad: number
) {}
saludar() {
console.log(`Mi nombre es ${this.nombre}`);
console.log(`me dicen ${this.alias}`);
console.log(`y tengo ${this.edad} años`);
}
}
const u1 = new usuario("Roberto", "Robert", 19);
u1.saludar();
La salida será…
Mi nombre es Francisco
me dicen Paco
y tengo 20 años