Los decoradores en TypeScript son una sintaxis para funciones especiales que se aplican a una clase, método, propiedad o parámetro para modificar o añadir comportamientos adicionales.
Estas funciones se ejecutan en tiempo de compilación y pueden realizar tareas como la modificación de la funcionalidad de un método, el seguimiento de las llamadas a un método, la validación de parámetros de entrada (entre muchas otras cosas)
Creación de un decorador básico
Para crear un decorador en Typescript, simplemente necesitamos definir una función con el nombre del decorador y aplicarla a la clase, método, propiedad o parámetro que queramos decorar. Por ejemplo,
function logMethod(target: any, key: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Método ${key} llamado con argumentos ${args}`);
return originalMethod.apply(this, args);
};
return descriptor;
}En este ejemplo, definimos una función llamada logMethod que toma tres parámetros:
target, que es la clase a la que se aplica el decoradorkey, que es el nombre del método decoradodescriptor, que es un objeto que contiene información sobre el método decorado
Por otro lado, en el cuerpo de esta función
- Guardamos una referencia al método original
- Redefinimos el método para que imprima un mensaje de registro antes de llamar al método original
- Finalmente devolvemos el descriptor modificado
Aplicación de un decorador
Una vez que hemos creado nuestro decorador, podemos aplicarlo a la clase, método, propiedad o parámetro que deseemos decorar utilizando el símbolo @ seguido del nombre del decorador.
Vamos a verlo continuando el ejemplo anterior, viendo cómo aplicar el decorador logMethod a un método de una clase:
class MyClass {
@logMethod
myMethod(arg1: string, arg2: number) {
console.log(`Método myMethod llamado con argumentos ${arg1} y ${arg2}`);
}
}En este ejemplo,
- Aplicamos el decorador
logMethodal métodomyMethodde la claseMyClass - Cuando se llame a
myMethod, el decorador imprimirá un mensaje de registro antes de ejecutar el código original del método.