首页 > 解决方案 > 是否可以在函数的参数类型中使用函数的返回类型?

问题描述

例如,当我尝试这样做时:

function chain<A, B extends (input: A, loop: (input: A) => C) => any, C extends ReturnType<B>> (input: A, handler: B): C {
   const loop = (input: A): C => handler(input, loop);
   return loop(input);
}

chain('test', async (value, loop): Promise<string> => {
   const ready = await someExternalThing();
   if (ready) {
      return value;
   } else {
      return await loop(value + '!');
   }
});

即使为处理函数定义了严格的返回类型,底部代码中循环函数的返回类型仍然显示为“任意”

有人知道解决这个问题的任何方法吗?

标签: typescript

解决方案


据我了解,以下工作并做你想做的事:

function chain<A, C> (input: A, handler: (input: A, loop: (input: A) => C) => C): C {
   const loop = (input: A): C => handler(input, loop);
   return loop(input);
}

chain<string, Promise<string>>('test', async (value, loop) => {
   const ready = await someExternalThing();
   if (ready) {
      return value;
   } else {
      return await loop(value + '!');
   }
})

关键是在调用时指定泛型参数chain


推荐阅读