🥇 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