我有一个函数,它接受一个payload
和一个配置options
对象作为其参数。 options
将包含两个函数,这些函数将被调用,以使function1
的结果作为function2
的参数传递,但是我似乎无法弄清楚如何获取类型推断将这些功能指定为对象的属性时正确地进行操作。
例如:
function inferenceDoesntWork<
TFirstFn extends () => any,
TSecondFn extends (arg: ReturnType<TFirstFn>) => any
>(
options: {
firstFunction: TFirstFn,
secondFunction: TSecondFn,
}
) {
const firstResult = options.firstFunction();
return options.secondFunction(firstResult)
}
console.log("not working", inferenceDoesntWork(
{
firstFunction: function fn1() { return true },
secondFunction: function fn2(arg) {
// INCORRECTLY INFERRED AS ANY
return arg
}
}
))
如果编写函数时将两个内部函数指定为外部函数参数,则类型推断将按预期工作:
function inferenceWorks<
TFirstFn extends () => any,
TSecondFn extends (arg: ReturnType<TFirstFn>) => any
>(
firstFunction: TFirstFn,
secondFunction: TSecondFn
) {
const firstResult = firstFunction();
return secondFunction(firstResult)
}
console.log("working", inferenceWorks(
function fn1() { return true },
function fn2(arg) {
// CORRECTLY INFERRED AS BOOLEAN
return arg
},
))
与@TypescriptTutor points out一样,如果将其指定为箭头函数,则可以正确推断:
function arrowFunctionsWork<
TFirstFn extends () => any,
TSecondFn extends (arg: ReturnType<TFirstFn>) => any
>(
options: {
firstFunction: TFirstFn,
secondFunction: TSecondFn,
}
) {
const firstResult = options.firstFunction();
return options.secondFunction(firstResult)
}
console.log("working", arrowFunctionsWork(
{
firstFunction: () => true,
secondFunction:(arg) => {
// correctly inferred as boolean
return arg
}
}
))
我已经查看了文档,但似乎找不到这种行为的解释。