高阶函数中的打字稿泛型类型推断

时间:2019-03-13 03:52:10

标签: typescript generics

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能够接受泛型类型的函数作为参数?

1 个答案:

答案 0 :(得分: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,则可以自己测试此代码。