> Что такое декораторы в 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);}@sealedclass Calculator {@logadd(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. - Пытаться использовать декораторы для простых задач, где хватит обычных функций.
- Неправильно понимать порядок выполнения - декораторы применяются снизу вверх (для нескольких декораторов на одном элементе).
> Похожие задачи по frontend
Что такое enum в TypeScript
Что такое объединение и пересечение типов в TypeScript
Что такое keyof в TypeScript и для чего он используется
Что такое generics в TypeScript и как они помогают создавать переиспользуемые компоненты?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью