代码之家  ›  专栏  ›  技术社区  ›  ShadowScripter gymshoe

类型推断、柯里化和泛型不返回预期的类型

  •  0
  • ShadowScripter gymshoe  · 技术社区  · 5 年前

    仍在学习泛型的类型魔法,我不明白为什么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>

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

    发生什么事?
    我在这里想做的事情能完成吗?

    0 回复  |  直到 5 年前
        1
  •  1
  •   kaya3 Amit Bera    5 年前

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

    而不是构建函数类型 T 从其参数和返回类型作为单独的类型参数,您可以使用 Parameters 和 ReturnType 要提取这些参数,这意味着它们根本不需要是类型参数:

    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

    推荐文章