我正在调用下面的函数,返回Promise<boolean>
const fnc = (i:number) : Promise<boolean> => Promise.resolve(true)
// Promise<boolean>
const res1 = errorHandler(errorPredicates.sdkError1, fnc, null, 4);
然而,当我用另一个错误处理程序嵌套它时,返回的对象变为Promise<any>
// Promise<any>
const res2 = errorHandler(errorPredicates.sdkError1, errorHandler, null, errorPredicates.sdkError2, fnc, null, 4);
下面是复制问题的typescript代码示例.我不确定这里出了什么问题,也不确定这是否是typescript的限制.我如何解决这个打字问题?
type PromiseFn = (...args: any[]) => Promise<any>;
type UnwrappedReturnType<T extends PromiseFn> = T extends (...args: any) => Promise<infer R> ? R : any
type ThrottlerPredicate = (err: any) => boolean;
type ThrottlerPredicates = {
sdkError1: ThrottlerPredicate
sdkError2: ThrottlerPredicate
}
const errorPredicates: ThrottlerPredicates = {
sdkError1: (err) => err?.message?.search(`429:`) != -1,
sdkError2: (err) => err?.message?.search(`Request was throttled.`) != -1
}
async function errorHandler<ApiFn extends PromiseFn>(
predicate: ThrottlerPredicate,
promiseFunction: ApiFn,
thisArg: ThisParameterType<ApiFn>,
...args: Parameters<ApiFn>
): Promise<UnwrappedReturnType<ApiFn>> {
let errCount = 0
do {
try {
const promiseResult = await promiseFunction.call(thisArg, ...args)
return promiseResult
} catch (err: any) {
//console.error(err)
if (predicate(err)) {
if (errCount < 20)
++errCount;
var ms = 1500 * errCount
} else
throw (err);
}
}
while (true);
}
const fnc = (i:number) : Promise<boolean> => Promise.resolve(true)
// Promise<boolean>
const res1 = errorHandler(errorPredicates.sdkError1, fnc, null, 4);
// Promise<any>
const res2 = errorHandler(errorPredicates.sdkError1, errorHandler, null, errorPredicates.sdkError2, fnc, null, 4);