Какой у тебя опыт работы с декораторами в TypeScript/Node.js?

«Какой у тебя опыт работы с декораторами в TypeScript/Node.js?» — вопрос из категории TypeScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я активно использую декораторы в TypeScript-проектах, особенно при работе с NestJS. Они отлично подходят для декларативного описания поведения классов и методов.

Практические примеры из моего опыта:

  1. Валидация: Создание кастомных декораторов для проверки входящих DTO.
  2. Логирование и профилирование: Обертывание методов для автоматического замера времени выполнения.

    function LogExecutionTime() {
      return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        const originalMethod = descriptor.value;
        descriptor.value = async function (...args: any[]) {
          const start = performance.now();
          const result = await originalMethod.apply(this, args);
          const end = performance.now();
          console.log(`${propertyKey} executed in ${end - start}ms`);
          return result;
        };
        return descriptor;
      };
    }
    
    class UserService {
      @LogExecutionTime()
      async findAllUsers() {
        // ... логика запроса к БД
      }
    }
  3. Работа с NestJS: Использование встроенных декораторов (@Get(), @Post(), @UseGuards(), @Inject()) для построения контроллеров, провайдеров и модулей. Это основа dependency injection и структуры приложения в этом фреймворке.

Я включаю флаг "experimentalDecorators": true в tsconfig.json и слежу за прогрессом этой функциональности в стандарте ECMAScript.