首页 > 解决方案 > 如何在 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参数的签名?

标签: typescript

解决方案


您可以创建一个使用和助手的通用函数。然后将根据您传入的内容推断出正确的类型:Parameters<T>ReturnType<T>

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);

推荐阅读