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