【问题标题】:typescript generic type inference in higher order function高阶函数中的打字稿泛型类型推断
【发布时间】:2019-03-13 03:52:09
【问题描述】:
function generate<P extends object>(init: (p: P) => void) {
  return function (p: P): P {
    init(p)
    return p
  }
}

const g = generate(function AAA<T>(p: T) {
  console.log(p)
})

const result = g({
  x: 1
})

result.x // TS2339: Property 'x' does not exist on type '{}'.

generate 函数是高阶函数,打字稿似乎无法推断出泛型类型P

如何使generate 能够接受泛型类型函数作为参数?

【问题讨论】:

标签: typescript generics


【解决方案1】:

Typescript 3.4 对泛型类型参数转发的处理进行了巨大改进。您可以阅读详细信息here

虽然您的代码在 3.4 中也无法正常工作,但如果我们将 init 函数更改为接受通用元组参数,我们就可以让它工作。这将导致类型参数转发启动:

function generate<A extends [any]>(init: (...p: A) => void) {
    return function (...p: A): A[0] {
        init(...p)
        return p
    }
}

const g = generate(function AAA<T>(p: T) {
    console.log(p)
})

const result = g({
    x: 1
})

result.x // ok now

如果你运行npm install typescript@next,你可以自己测试这段代码。

【讨论】:

  • 你能解释一下你所说的类型参数转发是什么意思吗?
  • @Wex 参数函数上的&lt;T&gt; 转发到generate 函数的返回。 g 上的类型参数没有在任何地方显式定义,而是来自 init 是通用的这一事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2022-11-23
  • 2020-03-01
  • 2020-12-17
  • 1970-01-01
相关资源
最近更新 更多