在简单的装饰器中保留方法签名

时间:2020-04-24 11:38:07

标签: typescript

也许有人可以建议,我实现了一个简单的装饰器,该装饰器接受方法,添加一些逻辑,并返回具有相同签名的方法。

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,method}?但是我想保留所传递方法的名称,例如,如果执行以下操作:

const {isBusy, myMethod} = useBusy(myMethod) 我希望打字稿检查响应名称,只允许isBusy和myMethod。

有可能吗?

1 个答案:

答案 0 :(得分:1)

您不能绑定到传递对象的名称。您可以做的就是获取一个对象作为输入,并输出该对象的扩展版本。

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