Typescript 泛型函数类型中的承诺结果值未知

Typescript 泛型函数类型中的承诺结果值未知,typescript,function,generics,promise,async-await,Typescript,Function,Generics,Promise,Async Await,我试图为返回承诺的函数键入一个泛型装饰器/包装器函数 我尝试过这段代码,但它在callFetch函数上返回Promise,而我希望它返回Promise,这是callAPI的返回类型 constcallapi=(param:string,userId:number)=>Promise.resolve({param,userId}); 函数wrappedFunctions(){ const userId=1; //假设重蚀刻函数 常量refetch=()=>{}; 常数包装=承诺,R>( 回叫:T,

我试图为返回承诺的函数键入一个泛型装饰器/包装器函数

我尝试过这段代码,但它在
callFetch
函数上返回
Promise
,而我希望它返回
Promise
,这是
callAPI
的返回类型

constcallapi=(param:string,userId:number)=>Promise.resolve({param,userId});
函数wrappedFunctions(){
const userId=1;
//假设重蚀刻函数
常量refetch=()=>{};
常数包装=承诺,R>(
回叫:T,,
):(…args:Parameters)=>Promise)=>async(…args:Parameters)=>{
常量响应=等待回调(…args);
重新蚀刻();
返回响应;
};
//回报承诺
//期待承诺
constcallfetch=wrapAction((param:string)=>callAPI(param,userId));
返回{
callFetch,
};
}

这里有一个。

代码的问题是
R
模板变量取决于
T
内容

但在您的情况下,您可以使用两个单独的模板变量,而不是扩展整个回调:一个用于args,另一个用于返回值:

例如:

const包装=(
回调:(…args:A)=>承诺,
):(…args:A)=>承诺=>异步(…args)=>{
常量响应=等待回调(…args);
重新蚀刻();
返回响应;
};
constcallfetch=wrapAction((param:string)=>callAPI(param,userId));
模板变量将提取参数列表(例如
[param:string]
)和
R
承诺返回类型(例如
{param:string;userId:number;}

const wrapAction = <A extends unknown[], R>(
    callback: (...args: A) => Promise<R>,
): ((...args: A) => Promise<R>) => async (...args) => {
    const response = await callback(...args);
    refetch();
    return response;
};

const callFetch = wrapAction((param: string) => callAPI(param, userId));