typescript - 如何在 TypeScript 中一般性地转发具有类型安全性的函数签名?

标签 typescript

我想知道是否有一个通用的解决方案可以在 TypeScript 中完全类型安全地转发函数参数。假设你有一个任意函数f。问题是,如何声明一个与 f 具有完全相同类型签名的函数。

例如在包装函数时会出现此问题:

function wrappedFunc(func: (...args: any[]) => any) {
  return (...args: any[]) => {
    console.log("func has been called");
    return func(...args);
  };
}

let f = wrappedFunc((a: number, b: number) => a + b);

基本上使用 ...args: any[] 有效,即 f(1, 2) 将按预期返回 3 。然而,f 丢失了 (a: number, b: number) => number 的类型签名,而是接受任何输入并具有 any 的返回类型.

有没有办法编写wrappedFunc,以便它返回的函数完美转发其func参数的签名?

最佳答案

您可以创建 generic function使用 Parameters<T> ReturnType<T> helper 。然后将根据您传入的内容推断出正确的类型:

function wrappedFunc<T extends ((...args: any[]) => any)>(func: T) {
  return (...args: Parameters<T>): ReturnType<T> => {
    console.log("func has been called");
    return func(...args);
  };
}

// `f` becomes `(a: number, b: number) => number`
let f = wrappedFunc((a: number, b: number) => a + b);

关于typescript - 如何在 TypeScript 中一般性地转发具有类型安全性的函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65790447/

相关文章:

typescript - 为什么我们不能把 const 改成 let 呢?

arrays - 类验证器 - 验证对象数组

javascript - text-overflow 属性自定义样式

Typescript 柯里化(Currying)和异步函数

javascript - 在 Typescript 中导入 Rx.Disposable

typescript - 使用自定义 promise 作为通用类型

typescript - Mikro-orm 属性类型日期和字段类型字符串的迁移错误

reactjs - 如何在 Typescript 上为 spread props 声明类型

typescript 多文件命名空间导出错误

angularjs - 访问声明函数中的私有(private)变量