Компромиссы
- Legacy-декораторы — «мёртвая ветка», на которой сидит половина экосистемы. Angular, NestJS, TypeORM, class-validator завязаны на
emitDecoratorMetadata, которого у Stage 3 нет. Мигрировать их на standard decorators сегодня нельзя. Для нового framework-agnostic кода — Stage 3.
- Декораторы прячут control flow. Поведение метода может тихо переписать аннотация из другого файла. Выразительно для cross-cutting concerns (логирование, memoization, access control) и больно отлаживать при ошибке. Оставляйте для действительно ортогональных задач.
- По умолчанию не меняют static type. Декоратор, добавивший поле в runtime, не делает TypeScript осведомлённым (Stage 3 улучшил, но ограничено). Нужен тип — часто отдельная декларация.
Итог
Legacy нужен DI/metadata; декораторы удобны для cross-cutting, но усложняют отладку и типы.