Как создавать пользовательские декораторы TypeScript

Декораторы — это функция TypeScript, которая позволяет изменять классы, методы, свойства или параметры во время выполнения. Это специальные функции, которые предоставляют возможности метапрограммирования. В TypeScript декораторы часто используются в таких фреймворках, как Angular, для улучшения функциональности. В этой статье объясняется, как создавать пользовательские декораторы шаг за шагом.

Типы декораторов в TypeScript

В TypeScript существует четыре основных типа декораторов:

  • Декораторы классов
  • Метод Декораторы
  • Декораторы аксессуаров
  • Декораторы недвижимости

Включение декораторов в TypeScript

Для использования декораторов в проекте TypeScript необходимо включить опцию experimentalDecorators в файле tsconfig.json.

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

Создание декоратора класса

Декораторы класса применяются к конструктору класса. Они полезны для добавления метаданных или функциональности в класс. Вот пример того, как создать простой декоратор класса.

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

Создание декоратора метода

Декораторы методов применяются к методам класса. Их можно использовать для изменения или наблюдения за поведением метода. Ниже приведен пример декоратора метода, который регистрирует выполнение метода.

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]

Создание декоратора недвижимости

Декораторы свойств можно использовать для наблюдения или изменения свойств. Вот пример, где декоратор свойств гарантирует, что свойство имеет значение по умолчанию.

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

Создание декоратора параметров

Декораторы параметров применяются к параметрам метода. Они могут быть полезны для таких задач, как проверка или регистрация аргументов. Вот пример декоратора параметров.

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

Заключение

Декораторы в TypeScript предлагают мощные возможности метапрограммирования, которые могут улучшить и расширить функциональность классов, методов и свойств. Используя пользовательские декораторы, можно создавать повторно используемые, эффективные и организованные структуры кода. В этом руководстве продемонстрировано создание различных типов декораторов: класса, метода, свойства и параметра.