Jak tworzyć niestandardowe dekoratory TypeScript

Dekoratory to funkcja w TypeScript, która umożliwia modyfikowanie klas, metod, właściwości lub parametrów w czasie wykonywania. Są to specjalne funkcje, które zapewniają możliwości metaprogramowania. W TypeScript dekoratory są często używane w frameworkach, takich jak Angular, w celu zwiększenia funkcjonalności. W tym artykule wyjaśniono krok po kroku, jak tworzyć niestandardowe dekoratory.

Typy dekoratorów w TypeScript

W TypeScript istnieją cztery główne typy dekoratorów:

  • Dekoratorzy klas
  • Dekoratory metod
  • Dekoratory akcesoriów
  • Dekoratorzy nieruchomości

Włączanie dekoratorów w TypeScript

Aby używać dekoratorów w projekcie TypeScript, opcja experimentalDecorators musi być włączona w pliku tsconfig.json.

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

Tworzenie dekoratora klasy

Dekoratory klasy są stosowane do konstruktora klasy. Są przydatne do dodawania metadanych lub funkcjonalności do klasy. Oto przykład, jak utworzyć prosty dekorator klasy.

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

Tworzenie dekoratora metody

Dekoratory metod są stosowane do metod klasowych. Mogą być używane do modyfikowania lub obserwowania zachowania metody. Poniżej znajduje się przykład dekoratora metod, który rejestruje wykonywanie metody.

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]

Tworzenie dekoratora nieruchomości

Dekoratory właściwości mogą być używane do obserwowania lub modyfikowania właściwości. Oto przykład, w którym dekorator właściwości zapewnia, że ​​właściwość ma wartość domyślną.

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

Tworzenie dekoratora parametrów

Dekoratory parametrów są stosowane do parametrów metody. Mogą być przydatne do zadań takich jak walidacja lub rejestrowanie argumentów. Oto przykład dekoratora parametrów.

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

Wniosek

Dekoratory w TypeScript oferują potężne możliwości metaprogramowania, które mogą ulepszyć i rozszerzyć funkcjonalność klas, metod i właściwości. Używając niestandardowych dekoratorów, możliwe jest tworzenie wielokrotnego użytku, wydajnych i uporządkowanych struktur kodu. Ten przewodnik pokazał tworzenie różnych typów dekoratorów: klasy, metody, właściwości i parametru.