Buscar..


Parámetros

Parámetro Detalles
objetivo La clase siendo decorada

Decorador de clase basica

Un decorador de clase es solo una función que toma a la clase como su único argumento y la devuelve después de hacer algo con ella:

function log<T>(target: T) {
    
    // Do something with target
    console.log(target);
    
    // Return target
    return target;

}

Entonces podemos aplicar el decorador de clase a una clase:

@log
class Person {
    private _name: string;
    public constructor(name: string) {
        this._name = name;
    }
    public greet() {
        return this._name;
    }
}

Generando metadatos utilizando un decorador de clase.

Esta vez vamos a declarar un decorador de clase que agregará algunos metadatos a una clase cuando le apliquemos:

function addMetadata(target: any) {
    
    // Add some metadata
    target.__customMetadata = {
        someKey: "someValue"
    };
    
    // Return target
    return target;

}

Entonces podemos aplicar el decorador de clase:

@addMetadata
class Person {
    private _name: string;
    public constructor(name: string) {
        this._name = name;
    }
    public greet() {
        return this._name;
    }
}

function getMetadataFromClass(target: any) {
    return target.__customMetadata;
}

console.log(getMetadataFromClass(Person));

El decorador se aplica cuando la clase no se declara cuando creamos instancias de la clase. Esto significa que los metadatos se comparten en todas las instancias de una clase:

function getMetadataFromInstance(target: any) {
    return target.constructor.__customMetadata;
}

let person1 = new Person("John");
let person2 = new Person("Lisa");

console.log(getMetadataFromInstance(person1));
console.log(getMetadataFromInstance(person2));

Pasando argumentos a un decorador de clase.

Podemos envolver un decorador de clase con otra función para permitir la personalización:

function addMetadata(metadata: any) {
    return function log(target: any) {
    
        // Add metadata
        target.__customMetadata = metadata;
        
        // Return target
        return target;
    
    }
}

El addMetadata toma algunos argumentos utilizados como configuración y luego devuelve una función sin nombre que es el decorador real. En el decorador podemos acceder a los argumentos porque hay un cierre en su lugar.

Entonces podemos invocar al decorador pasando algunos valores de configuración:

@addMetadata({ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" })
class Person {
    private _name: string;
    public constructor(name: string) {
        this._name = name;
    }
    public greet() {
        return this._name;
    }
}

Podemos usar la siguiente función para acceder a los metadatos generados:

function getMetadataFromClass(target: any) {
    return target.__customMetadata;
}

console.log(getMetadataFromInstance(Person));

Si todo salió bien, la consola debería mostrar:

{ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" } 


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow