簡體   English   中英

Typescript嵌套function換行返回類型問題

[英]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 的泛型期望基於輸入的參數的類型。 因此, res2PromiseFunction的返回類型是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM