Поиск по сайту
Ctrl + K
Вопросы по TS

Что такое Декораторы в TypeScript?

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

Как работают Декораторы?

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

Простой пример Декоратора

Вот пример простого декоратора, который добавляет информацию о том, что метод был вызван:

function LogMethod(target: any, key: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;

    descriptor.value = function(...args: any[]) {
        console.log(`Метод ${key} вызван с аргументами: ${JSON.stringify(args)}`);
        return originalMethod.apply(this, args);
    };
}

class Calculator {
    @LogMethod
    add(a: number, b: number): number {
        return a + b;
    }
}

const calc = new Calculator();
calc.add(5, 10);

Пояснение примера

  • Мы создаем декоратор LogMethod, который принимает три параметра:
    • target: объект, к которому мы применяем декоратор.
    • key: имя метода (или свойства), к которому применяется декоратор.
    • descriptor: объект описания, который содержит информацию о методе (или свойстве).
  • Внутри декоратора мы сохраняем оригинальный метод в переменной originalMethod и затем перезаписываем значение descriptor.value, чтобы добавить новую функциональность.
  • В примере класса Calculator мы используем декоратор @LogMethod для метода add. Теперь, каждый раз, когда мы вызываем add, будет выводиться в консоль информация о вызове с аргументами.
  • Разные виды декораторов

  • Декораторы классов: применяются к классам и могут выполнять дополнительные операции при создании экземпляра класса.
  • Декораторы методов: применяются к методам класса, как в нашем примере.
  • Декораторы свойств: применяются к свойствам класса и могут менять их поведение.
  • Декораторы параметров: позволяют аннотировать параметры методов с помощью метаданных.
  • Пример декоратора класса

    function Component(target: Function) {
        target.prototype.isComponent = true;
    }
    
    @Component
    class MyComponent {
        // Обычный класс
    }
    
    const instance = new MyComponent();
    console.log((instance as any).isComponent); // true
    

    Заключение

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