功能参数的打字稿副本签名

时间:2019-08-04 17:48:53

标签: typescript generics

我尝试创建一个将函数作为参数并返回具有相同签名的函数的函数。 看起来像这样:

function create<TCreator extends (...args: any) => any>(creator: TCreator) {
  return (...params: Parameters<TCreator>) => creator(params);
}

我这样使用它:

const created = create((a: string, b: string) => ({
  a,
  b
}));

当我查看created变量的类型时,返回类型为any而不是{ a: string, b: string}

const created: (a: string, b: string) => any

有什么主意我该如何解决?

1 个答案:

答案 0 :(得分:1)

TypeScript不知道输入函数类型与返回的函数类型有任何关系,因此,您不仅必须捕获参数类型(已正确完成!),还必须捕获参数类型。类型,如下所示:

function create<TCreator extends (...args: any[]) => any>(creator: TCreator) {
  return (...params: Parameters<TCreator>): ReturnType<TCreator> => creator(params);
}

两项调整:

  • ...args更改any -> any[]类型
  • 使用ReturnType<TCreator>类型指定新函数的返回类型(需要TypeScript 2.8或更高版本)