类型推理、currying和泛型没有返回预期的类型



仍在学习泛型的类型魔法,我不明白为什么这里有r:

const paginateQueryWith = <P, O, T extends (a: O) => P>(fn: T) => async (c: O) => {
return fn(c)
}
const r = paginateQueryWith((a: string) => parseInt(a))

不返回期望的类型:
(c: string) => Promise<number>
,而是返回
(c: unknown) => Promise<unknown>

我已经和一些人分享了它,他们也认为它可以正确地推断参数的类型和返回类型。

怎么回事
我想在这里做的事能完成吗?

当泛型类型参数只是其中一个参数的类型时,它们最容易推断;在这种情况下,T是函数参数的类型,因此可以在调用站点轻松推断,但PO不是函数参数的直接类型,因此无法轻松推断。

您可以使用ParametersReturnType来提取函数类型T,这意味着它们根本不需要是类型参数:

const paginateQueryWith =
<T extends (arg: any) => any>(fn: T) =>
async (c: Parameters<T>[0]): Promise<ReturnType<T>> => {
return fn(c)
}
// (c: string) => Promise<number>
const r = paginateQueryWith((a: string) => parseInt(a))

游乐场链接

最新更新