Сохранить сигнатуру метода в простом декораторе - PullRequest
0 голосов
/ 24 апреля 2020

Может быть, кто-то может посоветовать, я реализовал простой декоратор, который принимает метод, добавляет некоторые логики c и возвращает метод с той же сигнатурой.

type Method = (...args: any[]) => Promise<any>

 const useBusy = <T extends Method>(method: T): [boolean, T] => {
  const [isBusy, setIsBusy] = useState(false);
  const wrappedMethod = async (...args: any[]) => {
    setIsBusy(true);
    const result = await method.apply(this, args);
    setIsBusy(false)

    return result;
  }

  return [isBusy, wrappedMethod as T];
}

export default useBusy;

Можно ли сделать то же самое но вместо массива вернуть объект {IsBusy, метод}? Но я хочу сохранить имя переданного метода, например, если я сделаю следующее:

const {isBusy, myMethod} = useBusy(myMethod) Я хочу, чтобы машинопись проверяла имена ответов, должны быть разрешены только isBusy и myMethod.

Is это возможно?

1 Ответ

1 голос
/ 24 апреля 2020

Вы не можете привязать к имени переданного объекта. Что вы можете сделать, это получить объект в качестве входных данных и вывести расширенную версию этого объекта в качестве выходных данных.

const useBusy = <T extends { [k in keyof T]: Method }>(methodObj: T): T & { isBusy: boolean } => {
 ...
}

И затем вы можете сделать:

const busy = useBusy({myMethod});
const isBusy = busy.isBusy;
const myBusyMethod = busy.myMethod;

Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...