Forstå TypeScript-dekoratorer

TypeScript-dekoratorer gir en kraftig måte å legge til funksjonalitet til klasser, metoder, egenskaper og parametere under kjøring. De brukes ofte i rammeverk som Angular for avhengighetsinjeksjon, logging, validering og mer. Denne artikkelen vil forklare de forskjellige typer dekoratører i TypeScript og hvordan du bruker dem effektivt.

Hva er TypeScript-dekoratorer?

Dekoratorer i TypeScript er funksjoner som er prefikset med et @-symbol og kan knyttes til ulike elementer som klasser, metoder eller egenskaper. De lar deg endre oppførselen til koden de er knyttet til, uten å endre koden direkte.

Typer dekoratører

  • Klassedekoratører: Gjelder en hel klasse.
  • Metodedekoratorer: Brukes på en metode innenfor en klasse.
  • Eiendomsdekoratører: Gjelder en eiendom i en klasse.
  • Parameterdekoratorer: Brukes på parametrene til en metode i en klasse.

Slik aktiverer du dekoratører i TypeScript

Før du kan bruke dekoratorer, sørg for å aktivere dem i tsconfig.json-filen ved å sette "experimentalDecorators" til true.

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

Klasse dekoratører

En klassedekoratør brukes på en hel klasse. Det er nyttig for å legge til metadata eller endre oppførselen til en klasse.

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'

Metode Dekoratører

Metodedekoratorer brukes på metoder innenfor en klasse. Disse dekoratørene kan brukes til å endre eller logge oppførselen til en metode.

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'

Eiendomsdekoratører

Eiendomsdekoratører brukes til å legge til funksjonalitet til eiendommer i en klasse. De kan være nyttige for validering eller for å legge til metadata til en egenskap.

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'

Parameterdekoratører

Parameterdekoratorer brukes til å modifisere eller logge informasjon om metodeparametere.

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
  }
}

Konklusjon

Dekoratorer i TypeScript gir en kraftig måte å forbedre funksjonaliteten til koden uten å endre strukturen. Ved å forstå hvordan du bruker klasse-, metode-, egenskaps- og parameterdekoratorer, kan du implementere avanserte funksjoner som logging, validering og avhengighetsinjeksjon. Dekoratorer er en nøkkelfunksjon i TypeScript som i stor grad kan forbedre utviklingsarbeidsflyten din, spesielt i store applikasjoner.