1 回答

TA貢獻1827條經驗 獲得超8個贊
與其嘗試基于兩個特定鉤子的簽名向后工作,不如嘗試創建一個更通用的函數。Typescript 應該能夠根據您作為參數傳入的掛鉤來推斷特定類型。
從思考我們知道什么和不知道什么開始。我們不知道的東西變成了泛型。
鉤子是一個帶有一些參數(
A
)的函數??梢杂腥我鈹盗康娜我忸愋偷膮?(A extends any[]
)。它返回一些對象 (
R
),該對象可能具有名為“數據”的屬性 (R extends { data?: any }
)。reducer 是一個函數,它獲取鉤子 (
R['data']
) 返回的數據并將其映射到某個新值 (M
)。修改后的鉤子采用相同的參數 (
A
) 并返回一個對象,其中包含鉤子的所有返回值 (R
) 和一個附加屬性“_data”,其值從 reducer 返回 (M
) 或可能未定義 (R & { _data: M | undefined }
)。
把所有這些放在一起,我們得到這個:
export function wrapGQLHook<A extends any[], R extends { data?: any }, M>(
queryHook: (...args: A) => R,
reducer: (data: R['data']) => M,
) {
return (...args: A): R & { _data: M | undefined } => {
const queryResult = queryHook(...args)
let _data: M | undefined = undefined
if (queryResult.data) {
_data = reducer(queryResult.data)
}
return { ...queryResult, _data }
}
}
這似乎對我有用,但在不知道鉤子簽名的情況下我無法非常徹底地測試它。
添加回答
舉報