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
能够接受泛型类型的函数作为参数?
答案 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
,则可以自己测试此代码。