类型推断对于定义为对象属性的函数无法正常工作

时间:2020-03-06 18:48:22

标签: typescript type-inference typescript-generics

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

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

0 个答案:

没有答案
相关问题