函数参数的 typescript 复制签名

标签 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

知道如何解决这个问题吗?

最佳答案

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/

相关文章:

typescript :遗漏 'export' 关键字似乎使接口(interface)成为全局接口(interface)?

javascript - 我应该在 typeScript 中为我的 json 数据定义类型吗?

typescript - ts-node 忽略 d.ts 文件,而 tsc 成功编译项目

java - 为什么 java 允许向 List<String> 添加 int ?为什么泛型在编译时和运行时都没有严格实现?

c# - 扩展方法中where子句关键字的含义

reactjs - 情感风格不是压倒一切的组件

typescript - 带有 typescript 的 winston 自定义传输

java - 如何在java中继续使用泛型

generics - 有没有办法表达具有不同生命周期界限的 "same"泛型类型?

java - 转换到泛型导致 Java 中的 ArrayStoreException