【问题标题】:Type inference, currying and generics not returning the expected type类型推断、柯里化和泛型未返回预期类型
【发布时间】:2021-06-13 03:24:38
【问题描述】:

仍在学习泛型的类型魔法,我无法弄清楚为什么 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) =&gt; Promise&lt;number&gt;
而是返回
(c: unknown) =&gt; Promise&lt;unknown&gt;

我与一些人分享了它,他们也认为它会正确推断参数的类型和返回类型。

发生了什么事?
我在这里尝试做的事情可以完成吗?

【问题讨论】:

    标签: typescript type-inference typescript-generics


    【解决方案1】:

    泛型类型参数仅是参数之一的类型时最容易推断;在这种情况下,T 是函数参数的类型,因此可以在调用站点轻松推断,但 P 和 O 不是函数参数的直接类型,因此无法轻松推断。

    您可以使用Parameters 和ReturnType 来提取它们,而不是从其参数和返回类型构建函数类型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))
    

    Playground Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2020-08-20
      • 2020-01-23
      相关资源
      最近更新 更多