我正在嘗試創建一個函式實用程式,我可以在其中將陣列作為引數傳遞給函式,其中每個成員都是具有以下結構的陣列:
[ function, functionParams ]
基本上,這個助手將一些缺失的資訊添加到每個函式共有的函式引數中;一個例子是令牌值(這些函式進行 HTTP 呼叫);因此,實際上,提供給此函式的陣列值的成員如下所示:
[ Function, Omit<FunctionParams, CommonValues>]
我使用這個函式的方式是為這個輔助函式提供一個陣列,它以“并行”方式呼叫所有內容(使用 Redux-Saga all)。
我嘗試了很多方法都沒有成功地做到這一點;到目前為止,我最好的方法如下所示:
interface MyTypeFunction<T extends object = {}> {
( params: T & CommonProps ): any
}
function utilityHelper <T extends object> (
param: [ MyTypeFunction<T>, T ][],
) {
...
}
問題是,由于型別引數 ( T) 是為整個函式定義的,所以當我使用具有不同引數簽名的函式呼叫它時,TS 會出錯,因為它期望所有函式都具有相同的簽名,很可能是簽名陣列的第一個元素(盡管有時它看起來像 TS 使每個成員的引數相交,所以是的,我不太確定到底發生了什么)。這是一個使用它的例子:
const functionA: MyTypeFunction<{ name: string}> = param => {};
const functionB: MyTypeFunction<{ id: number }> = param => {};
utilityHelper( [
[ functionA, { name: 'Name' } ],
[ functionB, { id: 358 } ],
] );
這對于 functionB 會出錯,說類似于{id: number}is not assignable to type的內容{name: string}。
我正在嘗試做的事情真的可以完成嗎?
uj5u.com熱心網友回復:
你可能想要這樣的東西:
function utilityHelper <T extends any[]> (
param: [...{[K in keyof T]: [MyTypeFunction<T[K]>, T[K]]}],
) {}
這將強制您只能提供第二個元素是所提供函式的引數型別的元組。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494515.html
