typescript - 对于定义为对象属性的函数,类型推断无法按预期工作
问题描述
我有一个接受 apayload
和一个配置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 指出的那样,如果指定为箭头函数.. 它确实可以正确推断:
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
}
}
))
我已经查看了文档,但似乎找不到这种行为的解释。