Informazioni sui decoratori TypeScript

I decoratori TypeScript forniscono un modo potente per aggiungere funzionalità a classi, metodi, proprietà e parametri in fase di esecuzione. Sono spesso utilizzati in framework come Angular per l'iniezione di dipendenza, la registrazione, la convalida e altro. Questo articolo spiegherà i diversi tipi di decoratori in TypeScript e come utilizzarli in modo efficace.

Cosa sono i decoratori TypeScript?

I decoratori in TypeScript sono funzioni che hanno come prefisso il simbolo @ e possono essere collegate a vari elementi come classi, metodi o proprietà. Consentono di modificare il comportamento del codice a cui sono collegate, senza alterare direttamente il codice.

Tipi di decoratori

  • Decoratori di classe: Applicato a un'intera classe.
  • Decoratori di metodo: Applicati a un metodo all'interno di una classe.
  • Decoratori di proprietà: Applicato a una proprietà in una classe.
  • Decoratori dei parametri: Applicati ai parametri di un metodo in una classe.

Come abilitare i decoratori in TypeScript

Prima di poter utilizzare i decoratori, assicurati di abilitarli nel file tsconfig.json impostando "experimentalDecorators" su true.

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

Decoratori di classe

Un decoratore di classe viene applicato a un'intera classe. È utile per aggiungere metadati o modificare il comportamento di una classe.

function Controller(route: string) {
  return function (target: Function) {
    target.prototype.route = route;
  };
}

@Controller('/api/user')
class UserController {
  // Class logic
}

console.log(new UserController().route); // Outputs: '/api/user'

Decoratori di metodo

I decoratori di metodo vengono applicati ai metodi all'interno di una classe. Questi decoratori possono essere utilizzati per modificare o registrare il comportamento di un metodo.

function Log(target: any, propertyName: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  
  descriptor.value = function (...args: any[]) {
    console.log(`Calling ${propertyName} with arguments: ${args}`);
    return originalMethod.apply(this, args);
  };
}

class Calculator {
  @Log
  add(a: number, b: number) {
    return a + b;
  }
}

const calculator = new Calculator();
calculator.add(2, 3); // Logs: 'Calling add with arguments: 2,3'

Decoratori di proprietà

I decoratori di proprietà sono usati per aggiungere funzionalità alle proprietà in una classe. Possono essere utili per la convalida o per aggiungere metadati a una proprietà.

function ReadOnly(target: any, key: string) {
  const descriptor: PropertyDescriptor = {
    writable: false
  };
  return descriptor;
}

class Person {
  @ReadOnly
  name: string = 'John Doe';
}

const person = new Person();
person.name = 'Jane Doe'; // Error: Cannot assign to read only property 'name'

Decoratori dei parametri

I decoratori di parametri vengono utilizzati per modificare o registrare informazioni sui parametri del metodo.

function LogParameter(target: any, propertyName: string, index: number) {
  const metadataKey = `log_${propertyName}_parameters`;
  
  if (Array.isArray(target[metadataKey])) {
    target[metadataKey].push(index);
  } else {
    target[metadataKey] = [index];
  }
}

class Demo {
  method(@LogParameter param1: string, @LogParameter param2: number) {
    // Method logic
  }
}

Conclusione

I decoratori in TypeScript forniscono un modo potente per migliorare la funzionalità del tuo codice senza modificarne la struttura. Comprendendo come usare i decoratori di classe, metodo, proprietà e parametro, puoi implementare funzionalità avanzate come logging, validazione e iniezione di dipendenza. I decoratori sono una funzionalità chiave in TypeScript che può migliorare notevolmente il tuo flusso di lavoro di sviluppo, specialmente in applicazioni di grandi dimensioni.