Decorators, Classes (decoradores de clases) de Decorators, Classes (decoradores de clases)

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