> Что такое декораторы в TypeScript и для чего они используются (TypeScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: Soft_Media_Group, ЛОЦИЯ, Яндекс

Стек: TypeScript

> Пример ответа

Короткий ответ

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

Подробное объяснение

Декораторы - это экспериментальная фича TypeScript (включена через experimentalDecorators в tsconfig), основанная на proposal для JavaScript. Они представляют собой функции, которые принимают цель (target), имя свойства и дескриптор (для методов/свойств) и могут возвращать модифицированное поведение.

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

  • Class decorators - применяются к конструктору класса, могут заменить класс или добавить статические свойства.
  • Method decorators - применяются к методам, позволяют перехватывать вызовы, логировать, кешировать.
  • Accessor decorators - для геттеров/сеттеров.
  • Property decorators - для свойств, обычно используются для добавления метаданных.
  • Parameter decorators - для параметров методов, редко используются напрямую.

Декораторы выполняются в момент объявления, а не вызова. Они полезны для разделения сквозной функциональности (cross-cutting concerns) от бизнес-логики.

На практике

В реальных проектах декораторы часто применяются в:

  • Фреймворках (Angular, NestJS) - для компонентов, сервисов, инжекции зависимостей.
  • ORM (TypeORM) - для определения сущностей и связей.
  • Валидации - декораторы вроде @IsString() из class-validator.
  • Логировании - автоматический замер времени выполнения методов.
  • Контроле доступа - проверка прав перед вызовом метода.

Важно помнить: декораторы не меняют сигнатуру типов, но могут изменять runtime-поведение. Для работы с ними часто используют reflect-metadata для хранения метаданных.

Пример кода

TYPESCRIPT
// Декоратор для логирования вызова метода
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling ${propertyKey} with args: ${JSON.stringify(args)}`);
const result = originalMethod.apply(this, args);
console.log(`Result: ${JSON.stringify(result)}`);
return result;
};
return descriptor;
}
// Декоратор для заморозки класса (class decorator)
function sealed(constructor: Function) {
Object.seal(constructor);
Object.seal(constructor.prototype);
}
@sealed
class Calculator {
@log
add(a: number, b: number): number {
return a + b;
}
}
const calc = new Calculator();
calc.add(2, 3); // Выведет: Calling add with args: [2,3] и Result: 5

Как отвечать на собеседовании

Начни с краткого определения, затем перечисли типы декораторов и их применение. Приведи конкретный пример из практики - например, декоратор для логирования или валидации. Упомяни, что это экспериментальная фича, и для её включения нужен флаг в tsconfig. Если спросят про отличия от JavaScript - скажи, что в JS декораторы пока на стадии proposal, а в TS они уже давно используются.

Что проверяет интервьюер

  • Понимание концепции декораторов как инструмента метапрограммирования.
  • Знание синтаксиса и типов декораторов.
  • Умение объяснить, когда и зачем их применять.
  • Осознание ограничений (экспериментальная фича, не влияет на типы).
  • Практический опыт - например, работа с Angular или NestJS.

Типичные ошибки

  • Путать декораторы с обычными функциями-обёртками.
  • Думать, что декораторы изменяют типы (они работают только в runtime).
  • Забывать включить experimentalDecorators в tsconfig.
  • Пытаться использовать декораторы для простых задач, где хватит обычных функций.
  • Неправильно понимать порядок выполнения - декораторы применяются снизу вверх (для нескольких декораторов на одном элементе).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью