Понимание декораторов TypeScript

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

Что такое декораторы TypeScript?

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

Виды декораторов

  • Декораторы класса: Применяются ко всему классу.
  • Декораторы методов: Применяются к методу внутри класса.
  • Декораторы свойств: Применяются к свойству в классе.
  • Декораторы параметров: Применяются к параметрам метода в классе.

Как включить декораторы в TypeScript

Прежде чем использовать декораторы, обязательно включите их в файле tsconfig.json, установив "experimentalDecorators" в значение true.

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

Декораторы классов

Декоратор класса применяется ко всему классу. Он полезен для добавления метаданных или изменения поведения класса.

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'

Метод Декораторы

Декораторы методов применяются к методам внутри класса. Эти декораторы могут использоваться для изменения или протоколирования поведения метода.

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'

Декораторы недвижимости

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

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'

Декораторы параметров

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

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

Заключение

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