Skip to main content

Декораторы

Декораторы — это специальный вид функций, которые позволяют изменять или дополнять поведение классов, их методов, свойств и параметров. Они используются для метапрограммирования и широко применяются, например, в Angular.

Особенности:

  • Включаются флагом experimentalDecorators в tsconfig.json.
  • Представляют собой функции, принимающие конструктор или описание метода/свойства.
  • Применяются с @ перед именем.

Типы декораторов:

  1. Класс (@ClassDecorator)
  2. Метод (@MethodDecorator)
  3. Свойство (@PropertyDecorator)
  4. Аксессор (@AccessorDecorator)
  5. Параметр (@ParameterDecorator)

Примеры использования

  1. Декоратор класса - Добавляет новое свойство или изменяет поведение класса.
function WithTimestamp(constructor: Function) {
constructor.prototype.timestamp = new Date();
}

@WithTimestamp
class MyClass {}

const obj = new MyClass();
console.log((obj as any).timestamp); // Выведет текущую дату
  1. Декоратор метода - Логирует вызов метода.
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, аргументы: Алиса
// Привет, Алиса!
  1. Декоратор свойства - Изменяет значение свойства при создании объекта.
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