Позволяет ли декоратор передавать что-либо

«Позволяет ли декоратор передавать что-либо» — вопрос из категории TypeScript, который задают на 10% собеседований Frontend Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, декораторы могут принимать аргументы. Есть два основных способа:

  1. Декоратор с параметрами - оборачивается в ещё одну функцию:
function decorator(param) {
  return function(target) {
    target.prototype.param = param;
  }
}

@decorator('value')
class MyClass {}
  1. Декоратор метода с аргументами - может модифицировать поведение метода:
function logDecorator(target, name, descriptor) {
  const original = descriptor.value;
  descriptor.value = function(...args) {
    console.log('Arguments:', args);
    return original.apply(this, args);
  }
  return descriptor;
}

class Example {
  @logDecorator
  method(a, b) { return a + b; }
}

Декораторы получают доступ к:

  • Целевому объекту (класс/метод/свойство)
  • Его имени
  • Дескриптору (для методов)
  • Могут возвращать новый дескриптор