TypeScript
Decorador de clase
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" }