Hvordan lage tilpassede TypeScript-dekoratorer

Dekoratorer er en funksjon i TypeScript som gjør det mulig å endre klasser, metoder, egenskaper eller parametere under kjøring. De er spesielle funksjoner som gir metaprogrammeringsmuligheter. I TypeScript brukes dekoratører ofte i rammeverk som Angular for å forbedre funksjonaliteten. Denne artikkelen forklarer hvordan du lager skreddersydde dekoratører trinn for trinn.

Typer dekoratører i TypeScript

Det er fire hovedtyper dekoratører i TypeScript:

  • Klasse dekoratører
  • Metode Dekoratører
  • Tilbehør dekoratører
  • Eiendomsdekoratører

Aktivering av dekoratører i TypeScript

For å bruke dekoratører i et TypeScript-prosjekt, må experimentalDecorators-alternativet være aktivert i tsconfig.json-filen.

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

Opprette en klassedekoratør

Klassedekoratorer brukes på konstruktøren av en klasse. De er nyttige for å legge til metadata eller funksjonalitet til klassen. Her er et eksempel på hvordan du lager en enkel klassedekoratør.

function logClass(constructor: Function) {
  console.log(`Class ${constructor.name} is created`);
}

@logClass
class Person {
  constructor(public name: string) {}
}

const person = new Person("John");
// Output: Class Person is created

Opprette en metodedekoratør

Metodedekoratorer brukes på klassemetoder. De kan brukes til å modifisere eller observere oppførselen til metoden. Nedenfor er et eksempel på en metodedekorator som logger metodeutførelsen.

function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function (...args: any[]) {
    console.log(`Method ${propertyKey} is called with arguments:`, args);
    return originalMethod.apply(this, args);
  };

  return descriptor;
}

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

const calc = new Calculator();
calc.add(2, 3); 
// Output: Method add is called with arguments: [2, 3]

Opprette en eiendomsdekoratør

Eiendomsdekoratører kan brukes til å observere eller endre egenskaper. Her er et eksempel der en eiendomsdekoratør sørger for at en eiendom har en standardverdi.

function defaultValue(value: any) {
  return function (target: any, propertyKey: string) {
    let propertyValue = value;

    const getter = function () {
      return propertyValue;
    };

    const setter = function (newValue: any) {
      propertyValue = newValue || value;
    };

    Object.defineProperty(target, propertyKey, {
      get: getter,
      set: setter,
      enumerable: true,
      configurable: true,
    });
  };
}

class User {
  @defaultValue('Anonymous')
  name!: string;
}

const user = new User();
console.log(user.name); // Output: Anonymous
user.name = 'Alice';
console.log(user.name); // Output: Alice

Opprette en parameterdekorator

Parameterdekoratorer brukes på en metodes parametere. De kan være nyttige for oppgaver som validering eller logging av argumenter. Her er et eksempel på en parameterdekorator.

function logParameter(target: any, propertyKey: string, parameterIndex: number) {
  console.log(`Parameter at index ${parameterIndex} in method ${propertyKey} is being decorated`);
}

class Vehicle {
  drive(@logParameter speed: number) {
    console.log(`Driving at speed ${speed}`);
  }
}

const vehicle = new Vehicle();
vehicle.drive(50);
// Output: Parameter at index 0 in method drive is being decorated

Konklusjon

Dekoratorer i TypeScript tilbyr kraftige metaprogrammeringsfunksjoner som kan forbedre og utvide funksjonaliteten til klasser, metoder og egenskaper. Ved å bruke tilpassede dekoratører er det mulig å lage gjenbrukbare, effektive og organiserte kodestrukturer. Denne guiden demonstrerte opprettelsen av forskjellige typer dekoratører: klasse, metode, eiendom og parameter.