首页 > 解决方案 > 对于定义为对象属性的函数,类型推断无法按预期工作

问题描述

我有一个接受 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
    }
  }
))

我已经查看了文档,但似乎找不到这种行为的解释。

标签: typescripttype-inferencetypescript-generics

解决方案


推荐阅读