我有一個功能time
const time = <T>(fn: (...args: any[]) => Promise<T>, ...args: any[]): Promise<T> => {
return new Promise(async (resolve, reject) => {
const timer = setTimeout(() => reject(`Error: ${fn.name} timed out`), ms)
try {
resolve(await fn.bind(thisArg)(...args))
} catch(err) {
reject(err)
} finally {
clearTimeout(timer)
}
})
}
我想知道是否有辦法避免any使用...args? 特別是因為我想將...args簽名fn(fn: (...args: any[]) => Promise<T>)中的型別與...args(函式的第二個引數)的型別相關聯time。這兩個...args是相同的引數,所以看起來它們應該通過泛型相關聯。我想到了這樣的事情:
const time = <T, U>(fn: (...args: U[]) => Promise<T>, ...args: U[]): Promise<T>
但這似乎是錯誤的,因為這些引數不會都是同一型別。相反,無論簽名...args中的型別是什么fn,也將是函式第二個引數的...args型別time。
uj5u.com熱心網友回復:
我們可以這樣做:
const time = <T, U extends unknown[]>(fn: (...args: U) => Promise<T>, ...args: U): Promise<T>
游樂場鏈接
引數不會都是相同的型別
的型別...args確實必須是陣列/元組,因為它使用了一個休息運算子。
但是不是鍵入 as U[],這確實會強制每個單獨的引數為 type U,我們可以簡單地使用泛型鍵入整個陣列,前提是它被限制為一個陣列:U extends unknown[]現在我們可以做...args: U
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482087.html
