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

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

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

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

Существует несколько типов декораторов:

  • Классовые декораторы — применяются к классам.
  • Методные декораторы — применяются к методам классов.
  • Свойствные декораторы — применяются к свойствам классов.
  • Параметрические декораторы — применяются к параметрам методов.
  • Пример: Создание пользовательского декоратора

    Рассмотрим, как создать простой методный декоратор, который будет логировать вызовы метода.

    Шаг 1: Включите поддержку декораторов

    Убедитесь, что в вашем проекте включены декораторы. Для этого в tsconfig.json установите следующие параметры:

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

    Шаг 2: Создание декоратора

    Теперь создадим простой декоратор, который будет логировать наименование метода перед его вызовом.

    function LogMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        const originalMethod = descriptor.value; // Сохраняем оригинальный метод
    
        descriptor.value = function (...args: any[]) {
            console.log(`Вызов метода: ${propertyKey}, аргументы: ${JSON.stringify(args)}`);
            return originalMethod.apply(this, args); // Вызов оригинального метода
        };
    
        return descriptor; // Возвращаем измененный дескриптор
    }
    
    class MyClass {
        @LogMethod
        sayHello(name: string): string {
            return `Привет, ${name}!`;
        }
    }
    
    const myClassInstance = new MyClass();
    console.log(myClassInstance.sayHello('Мир')); // Вызов метода: sayHello, аргументы: ["Мир"]
    

    Объяснение кода

  • Функция LogMethod — это наш пользовательский декоратор. Он принимает три параметра:
    • target — это класс, к которому применяется декоратор.
    • propertyKey — это имя метода, который мы декорируем.
    • descriptor — это объект дескриптора, который содержит информацию о методе и позволяет изменять его.
  • Мы сохраняем оригинальный метод в переменную originalMethod, а затем оборачиваем его в новую функцию, которая сначала логирует данные, а затем вызывает оригинальный метод с переданными аргументами.
  • Декоратор применяется к методу sayHello с помощью символа @, что позволяет отследить все его вызовы.
  • Заключение

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