Вывод типа не работает должным образом для функций, определенных как свойства объекта - PullRequest
1 голос
/ 06 марта 2020

У меня есть функция, которая принимает 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 указывает , однако, если указано как функция стрелки ... он делает правильно вывести:

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
    }
  }
))

Я рассмотрел Документы и я не можем найти объяснение этому поведению.

...