Что такое декораторы в TypeScript и для чего они используются
Что проверяют
Знаете ли вы, что есть два несовместимых варианта, и понимаете ли, где они применяются.
Как отвечать
Декоратор это функция, которая изменяет или дополняет класс, метод, свойство или параметр. Записывается через символ решётки перед объявлением.
Применение почти всегда одно и то же: объявить намерение метаданными, а поведение реализовать каркасом. Отсюда их массовое использование в каркасах:
- описание компонентов и внедрение зависимостей в Angular и NestJS;
- описание маршрутов и проверки входных данных;
- описание сущностей в библиотеках работы с базой;
- превращение полей в наблюдаемые в библиотеках состояния.
Что обязательно сказать: существует два разных варианта декораторов, и они несовместимы.
- старый экспериментальный, включаемый отдельным флагом. Именно на нём построены Angular и большинство существующих библиотек. Он же умеет работать с метаданными типов через дополнительную библиотеку, что и позволяет внедрять зависимости по типу параметра;
- стандартный, появившийся в пятой версии. Соответствует принятому предложению в стандарт языка, имеет другую сигнатуру и не поддерживает декораторы параметров, из-за чего внедрение зависимостей по типу на нём пока не работает.
Отсюда практический вывод: выбор варианта диктуется каркасом, а не вкусом, и смешивать их в одном проекте нельзя.
Ограничение, о котором стоит знать: часть инструментов сборки, транспилирующих без проверки типов, не поддерживает получение метаданных о типах. Поэтому библиотека, полагающаяся на них, может не работать с определённым сборщиком, и это регулярный источник загадочных ошибок.
Своими руками декораторы в прикладном коде пишут редко: обычно они приходят из каркаса. Осмысленный самостоятельный случай это сквозные вещи вроде замера времени, повторов, кэширования.
Где спотыкаются
Не знают о двух вариантах и смешивают их.
Ожидают работы метаданных типов при сборке инструментом, который их не поддерживает.
Пишут декораторы для предметной логики, пряча её от читателя.
Считают их частью языка, хотя это ещё предложение в стандарт.