1 回答
TA贡献1827条经验 获得超7个赞
与其尝试基于两个特定钩子的签名向后工作,不如尝试创建一个更通用的函数。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 }
}
}
这似乎对我有用,但在不知道钩子签名的情况下我无法非常彻底地测试它。
添加回答
举报