Декораторы
Декораторы — это специальный вид функций, которые позволяют изменять или дополнять поведение классов, их методов, свойств и параметров. Они используются для метапрограммирования и широко применяются, например, в Angular.
Особенности:
- Включаются флагом experimentalDecorators в tsconfig.json.
- Представляют собой функции, принимающие конструктор или описание метода/свойства.
- Применяются с @ перед именем.
Типы декораторов:
- Класс (@ClassDecorator)
- Метод (@MethodDecorator)
- Свойство (@PropertyDecorator)
- Аксессор (@AccessorDecorator)
- Параметр (@ParameterDecorator)
Примеры использования
- Декоратор класса - Добавляет новое свойство или изменяет поведение класса.
function WithTimestamp(constructor: Function) {
constructor.prototype.timestamp = new Date();
}
@WithTimestamp
class MyClass {}
const obj = new MyClass();
console.log((obj as any).timestamp); // Выведет текущую дату
- Декоратор метода - Логирует вызов метода.
function Log(target: any, methodName: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Вызван метод: ${methodName}, аргументы: ${args}`);
return original.apply(this, args);
};
}
class MyClass {
@Log
sayHello(name: string) {
console.log(`Привет, ${name}!`);
}
}
new MyClass().sayHello("Алиса");
// В консоли:
// Вызван метод: sayHello, аргументы: Алиса
// Привет, Алиса!
- Декоратор свойства - Изменяет значение свойства при создании объекта.
function DefaultValue(value: any) {
return function (target: any, propertyKey: string) {
let _val = value;
Object.defineProperty(target, propertyKey, {
get: () => _val,
set: (newVal) => _val = newVal,
enumerable: true,
configurable: true
});
};
}
class User {
@DefaultValue("Гость")
name: string;
}
const user = new User();
console.log(user.name); // "Гость"
Итог
- Декораторы позволяют изменять классы и их члены.
- Их часто используют в фреймворках (например, Angular).
- Требуют включения
experimentalDecorators. - Альтернативой являются метапрограммирование и DI (dependency injection).
❗ Важно: В JavaScript декораторы пока находятся в стадии разработки (TC39 Stage 3).
🚀 Источник: ChatGPT