馃敟 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