【发布时间】:2021-08-08 18:38:44
【问题描述】:
我有一个mapResponse 函数,它接受另一个函数(调用者)和一个映射器函数。函数的结果应该是第三个函数,它是提供的回调的组合:它应该接受调用者的参数,但返回映射器的结果。
调用者可能会产生 Promise,所以应该在 mapper 获取他的参数之前将 Promise 解包。
所以我的问题不是实现(已经完成)而是打字。如何使用 Typescript 声明来描述这种行为?
export function mapResponse<
Caller extends (...args: any[]) => unknown,
Mapper extends <R>(response: Unpacked<ReturnType<Caller>>) => R
>(
caller: Caller,
mapper: Mapper
): (...args: Parameters<Caller>) => ReturnType<Mapper> {
return (...args: Parameters<Caller>) => {
const res = caller(...args) as Unpacked<ReturnType<Caller>>
if (res instanceof Promise) {
return res.then(mapper) as ReturnType<Mapper>
}
return mapper(res)
}
}
如果有人需要,这里是Unpacked 声明:
export type Unpacked<T> = T extends (infer U)[]
? U : T extends (...args: any[]) => infer U
? U : T extends Promise<infer U>
? U : T
【问题讨论】:
标签: typescript typescript-typings typescript-generics typescript2.0