我想知道是否有一个通用的解决方案可以在 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/