我尝试创建一个函数,该函数将函数作为参数并返回具有相同签名的函数。 看起来像这样:
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
知道如何解决这个问题吗?
最佳答案
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 或更高版本)
关于函数参数的 typescript 复制签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348935/