也许有人可以建议,我实现了一个简单的装饰器,该装饰器接受方法,添加一些逻辑,并返回具有相同签名的方法。
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。
有可能吗?
答案 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;