我尝试创建一个将函数作为参数并返回具有相同签名的函数的函数。 看起来像这样:
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
有什么主意我该如何解决?
答案 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或更高版本)