Декораторы
Специальные функции для модификации классов, методов и свойств через аннотации.
Зачем нужно
- Добавление поведения без изменения исходного кода (метапрограммирование)
- Логирование, валидация, кэширование декларативно
- Основа фреймворков: Angular, NestJS, TypeORM
Где используется
- Angular (@Component, @Injectable), NestJS (@Controller, @Get), TypeORM (@Entity)
Включение
{
"compilerOptions": {
"experimentalDecorators": true
}
}
Типы декораторов
Декоратор класса
function Sealed(constructor: Function) {
Object.seal(constructor);
Object.seal(constructor.prototype);
}
@Sealed
class User {
name = 'Alice';
}
Декоратор метода
function Log(target: any, key: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;
descriptor.value = function (...args: any) {
console.log(`${key} called with`, args);
return original.apply(this, args);
};
}
class Calculator {
@Log
add(a: number, b: number) {
return a + b;
}
}
Декоратор свойства
function MinLength(min: number) {
return function (target: any, key: string) {
let value: string;
Object.defineProperty(target, key, {
get: => value,
set: (v: string) => {
if (v.length < min) throw new Error(`${key} min length: ${min}`);
value = v;
},
});
};
}
class Form {
@MinLength(3)
username!: string;
}
TC39 Decorators (Stage 3)
Новый стандарт отличается синтаксически. TS 5.0+ поддерживает оба варианта. Для нового кода рекомендуется новый стандарт (без experimentalDecorators).