1 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
與其嘗試基于兩個特定鉤子的簽名向后工作,不如嘗試創(chuàng)建一個更通用的函數(shù)。Typescript 應(yīng)該能夠根據(jù)您作為參數(shù)傳入的掛鉤來推斷特定類型。
從思考我們知道什么和不知道什么開始。我們不知道的東西變成了泛型。
鉤子是一個帶有一些參數(shù)(
A
)的函數(shù)??梢杂腥我鈹?shù)量的任意類型的參數(shù) (A extends any[]
)。它返回一些對象 (
R
),該對象可能具有名為“數(shù)據(jù)”的屬性 (R extends { data?: any }
)。reducer 是一個函數(shù),它獲取鉤子 (
R['data']
) 返回的數(shù)據(jù)并將其映射到某個新值 (M
)。修改后的鉤子采用相同的參數(shù) (
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 }
}
}
這似乎對我有用,但在不知道鉤子簽名的情況下我無法非常徹底地測試它。
添加回答
舉報