Что такое декораторы в TypeScript?
Декораторы — это специальные функции, которые можно применять к классам, методам, свойствам или параметрам, чтобы добавить или изменить поведение во время выполнения или компиляции.
Декораторы — это своего рода "аннотации" или "модификаторы", работающие на уровне метаданных.
Для работы с декораторами нужно включить флаги:
{
  "experimentalDecorators": true,
  "emitDecoratorMetadata": true
}
Где можно использовать декораторы?
- Классы
- Методы
- Свойства
- Параметры
- Аксессоры (get/set)
Пример: Классовый декоратор
function Logger(constructor: Function) {
  console.log(`Класс создан: ${constructor.name}`);
}
@Logger
class User {
  constructor(public name: string) {}
}
Декоратор Logger будет вызван при определении класса User, выводя имя конструктора.
Пример: Декоратор метода
function LogMethod(
  target: any,
  propertyKey: string,
  descriptor: PropertyDescriptor
) {
  const original = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log(`Метод ${propertyKey} вызван с`, args);
    return original.apply(this, args);
  };
}
class MathService {
  @LogMethod
  sum(a: number, b: number) {
    return a + b;
  }
}
Этот декоратор логирует вызов метода и его аргументы.
Пример: Декоратор свойства
function Readonly(target: any, propertyKey: string) {
  Object.defineProperty(target, propertyKey, {
    writable: false,
  });
}
class Config {
  @Readonly
  version = "1.0";
}
Свойство version теперь невозможно изменить.
Пример: Декоратор параметра
function LogParam(target: Object, propertyKey: string | symbol, parameterIndex: number) {
  console.log(`Параметр метода ${String(propertyKey)} на позиции ${parameterIndex}`);
}
class Example {
  test(@LogParam msg: string) {
    console.log(msg);
  }
}
Используется редко, но может быть полезен для валидации или логирования.