У меня есть функция, которая принимает 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
}
}
))
Я рассмотрел Документы и я не можем найти объяснение этому поведению.