Создать декоратор с параметрами и получить доступ к оформленным параметрам функции - PullRequest
0 голосов
/ 08 марта 2020

Я хочу написать декоратор журналов, который регистрирует каждый раз, когда вызывается функция (в которой декоратор декорирует). Я хочу записать ключ, который декоратор принимает в качестве параметра, и аргументы, с которыми была отправлена ​​функция.

До сих пор я знал, как написать простую функцию журнала, которая регистрирует аргументы функции, но не может принимать любые параметры :

export function logger(
  target: Object,
  key: string,
  descriptor: PropertyDescriptor
) {
  const original = descriptor.value;
  descriptor.value = function() {
    const targetName = target.constructor.name;
    const args = JSON.stringify(arguments);
    console.log(`Calling ${targetName}.${key} with ${JSON.stringify(arguments)}`);
    const result = original.apply(this, arguments);
    return result;
  };
  return descriptor;
}

Я также знаю, как написать декоратор, который принимает параметры:

log(logData: { value: string; target?: string }) {
    return function(
      target: Object,
      key: string,
      descriptor: PropertyDescriptor
    ) {
      console.log(`Key: ${logData.value}, Target: ${logData.target}`);

    };
  }

Так что вы, вероятно, можете догадаться, что мне не хватает ссылки здесь, чтобы написать декоратор журнала который может принять ключ в качестве параметра и записать этот ключ в аргументы, с которыми была вызвана декорированная функция.

У меня есть рабочий пример этих двух декораторов: https://stackblitz.com/edit/angular-udi-decorators?file=src%2Fapp%2Flogger.ts

1 Ответ

0 голосов
/ 08 марта 2020

Итак, я понял это. Мое решение работает. Я хотел создать декоратор для функции, которая будет сохранять данные при каждом вызове функции. Он сохранит уникальный ключ для каждой функции (он будет предоставлен декоратором) и отправит также параметры, которые были отправлены этой функции.

logWithData(logData: { value: string; target?: string }) {
    return function logger(
      target: Object,
      key: string,
      descriptor: PropertyDescriptor
    ) {
      const original = descriptor.value;
      descriptor.value = function() {
        const targetName = target.constructor.name;
        const args = JSON.stringify(arguments);
        console.log(`Key: ${logData.value}, Target: ${logData.target}, paramater: ${arguments[0]}`);
        const result = original.apply(this, arguments);
        return result;
      };
      return descriptor;
    };
  }

Я также поместил этот код в stackblitz здесь

...