[英]Typescript nested function wrapping Return type problem
我正在調用下面的 function 返回我Promise<boolean>
const fnc = (i:number) : Promise<boolean> => Promise.resolve(true)
// Promise<boolean>
const res1 = errorHandler(errorPredicates.sdkError1, fnc, null, 4);
但是,當我將它與另一個錯誤處理程序嵌套時,返回的 object 更改為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);
返回類型是Promise<any>
的原因是 Typecript 的泛型期望基於輸入的參數的類型。 因此, res2
中PromiseFunction
的返回類型是Promise<UnwrappedReturnType<ApiFn>
。 UnwrappedReturnType
類型需要PromiseFn
類型的返回值。 此時ApiFn
類型是PromiseFn
的擴展,而PromiseFn
類型的返回值是Promise<any>
,所以UnwrappedReturnType<ApiFn>
類型是any
。 同樣,用作參數的errorHandler
通用ApiFn
類型與PromiseFn
((...args: any[]) => Promise<any>) 類型相同,因為沒有期望的參數。
換句話說,如果您指定ApiFn
通用類型,則可以進行res2
類型推斷。
...
type ErrorHandler<ApiFn extends PromiseFn> = (
predicate: ThrottlerPredicate,
promiseFunction: ApiFn,
thisArg: ThisParameterType<ApiFn>,
...args: Parameters<ApiFn>
) => Promise<UnwrappedReturnType<ApiFn>>;
// Promise<boolean>
const res2 = errorHandler(errorPredicates.sdkError1, errorHandler as ErrorHandler<typeof fnc>, null, errorPredicates.sdkError2, fnc, null, 4);
不幸的是,我沒有理解你想要的function,所以我根據你的問題回答了。 如果你能給我解釋一下邏輯,我會考慮更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.