Декоратор Typescript - принимает слишком мало аргументов для использования здесь в качестве декоратора - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь написать декоратор, который принимает метод и выдает ошибку, если метод не завершился в течение указанного времени ожидания (указанного с помощью аргументов метода). Не указание тайм-аута должно привести к тому, что метод будет работать, как будто аргумента нет.

export const setMethodTimeout = (): Function => {
  return function(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
    const context = this;
    const args: DecoratorArgumentType = arguments;
    if (args.timeout) {
      const timer = setTimeout(() => {
        throw new Error('The method did not finish before the specified timeout.');
      }, args.timeout);
      const originalMethod = descriptor.value;
      descriptor.value = function() {
        originalMethod
          .apply(context, args)
          .then((result: any) => {
            clearTimeout(timer);
            return result;
          })
          .catch((e: Error) => {
            throw e;
          });
      };
    }
    return descriptor;
  };
};

Теперь, когда я пытаюсь использовать этот декоратор в моем методе класса:

@setMethodTimeout
public async getMap(params: GetMapParams, api: ApiType, reqConfig?: RequestConfiguration): Promise<Blob> {
   //...
}

I получите следующую ошибку машинописного текста:

'setMethodTimeout' принимает слишком мало аргументов для использования здесь в качестве декоратора. Вы хотели сначала вызвать его и написать «@setMethodTimeout ()»?

Почему это происходит?

1 Ответ

0 голосов
/ 25 мая 2020

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

export const function setMethodTimeout(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
    const context = this;
    const args: DecoratorArgumentType = arguments;
    if (args.timeout) {
      const timer = setTimeout(() => {
        throw new Error('The method did not finish before the specified timeout.');
      }, args.timeout);
      const originalMethod = descriptor.value;
      descriptor.value = function() {
        originalMethod
          .apply(context, args)
          .then((result: any) => {
            clearTimeout(timer);
            return result;
          })
          .catch((e: Error) => {
            throw e;
          });
      };
    }
    return descriptor;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...