I decoratori sono una funzionalità chiave di TypeScript che permettono di aggiungere funzionalità a classi, metodi e proprietà in modo dichiarativo, senza dover modificare il codice sorgente. I decoratori sono una tecnica di programmazione orientata agli aspetti (AOP) che permette di separare la logica di una funzionalità dalla logica principale dell’applicazione.
Per creare un decoratore, è necessario utilizzare la sintassi @nome_decoratore, dove nome_decoratore è il nome del decoratore. I decoratori possono essere utilizzati su classi, metodi e proprietà.
Ecco alcuni esempi di utilizzo di decoratori in TypeScript:
// Definizione di un decoratore di classe
function logClasse(target: any) {
console.log(`Classe ${target.name} creata.`);
}
// Utilizzo del decoratore di classe
@logClasse
class MiaClasse {
constructor() {}
}
// Definizione di un decoratore di metodo
function logMetodo(target: any, key: string, descriptor: PropertyDescriptor) {
const originale = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Chiamata del metodo ${key} con argomenti: ${JSON.stringify(args)}`);
return originale.apply(this, args);
};
return descriptor;
}
// Utilizzo del decoratore di metodo
class MiaClasse {
@logMetodo
miaFunzione(arg1: string, arg2: number) {
console.log(`miaFunzione eseguita con ${arg1} e ${arg2}`);
}
}
// Definizione di un decoratore di proprietà
function logProprieta(target: any, key: string) {
let valore = target[key];
const getter = function () {
console.log(`Recupero valore ${valore}`);
return valore;
};
const setter = function (n: number) {
console.log(`Impostazione valore ${n}`);
valore = n;
};
Object.defineProperty(target, key, {
get: getter,
set: setter,
});
}
// Utilizzo del decoratore di proprietà
class MiaClasse {
@logProprieta
miaProprieta: number;
}
Nell’esempio sopra, il decoratore logClasse
viene utilizzato per loggare la creazione di una classe. Il decoratore logMetodo
viene utilizzato per loggare l’invocazione di un metodo della classe, mentre il decoratore logProprieta
viene utilizzato per loggare l’accesso e l’impostazione di una proprietà.