Что такое декоратор в TypeScript

Ответ

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

Пример декоратора метода:

function log(target: any, key: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args: any[]) {
    console.log(`Calling ${key} with args:`, args);
    return originalMethod.apply(this, args);
  };
  return descriptor;
}

class Example {
  @log
  greet(name: string) {
    return `Hello, ${name}!`;
  }
}

Основные типы декораторов:

  1. Класса (@ClassDecorator)
  2. Метода (@MethodDecorator)
  3. Свойства (@PropertyDecorator)
  4. Параметра (@ParameterDecorator)

Декораторы часто используются для логирования, валидации, dependency injection (например, в Angular) или модификации поведения.

Ответ 18+ 🔞

Да ты посмотри, какие штуки придумали, блядь! Декоратор, сука! Ну это ж просто функция, которая как банный лист на всё лепится, чтобы метаданные прикрутить или поведение поменять. В TypeScript это вообще красота — ставишь собачку @ перед чем надо, и всё, пиздец, магия начинается прямо при инициализации класса.

Вот смотри, примерчик, чтобы не быть, как тот Герасим, немым:

function log(target: any, key: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args: any[]) {
    console.log(`Calling ${key} with args:`, args);
    return originalMethod.apply(this, args);
  };
  return descriptor;
}

class Example {
  @log
  greet(name: string) {
    return `Hello, ${name}!`;
  }
}

Видишь? Навесил @log на метод — и теперь каждый вызов будет в консоль проёбываться, кто и с какими аргументами пришёл. Удобно, блядь, для отладки — не надо вручную в каждый метод console.log впихивать, ебать мои старые костыли.

А видов-то этих декораторов, оказывается, овердохуища:

  1. На класс (@ClassDecorator) — обернёт весь класс, как тот мешок для Муму.
  2. На метод (@MethodDecorator) — вот как в примере выше, самый популярный пацан.
  3. На свойство (@PropertyDecorator) — чтобы за какими-то полями следить.
  4. На параметр (@ParameterDecorator) — это уже для самых хитрых жоп, чтобы в аргументы метода заглянуть.

Используют эту хуйню везде: логирование, валидация, dependency injection (как в том Angular, который весь на них и стоит, блядь). В общем, мощный инструмент, чтобы не повторять один и тот же код, как мантру, в каждом классе. Главное — не переборщить, а то получится пиздопроебибна из собачек и скобочек, в которой ни хуя не разберёшься.