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
参数的签名?
解决方案
您可以创建一个使用和助手的通用函数。然后将根据您传入的内容推断出正确的类型: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);
推荐阅读
- php - 变量未使用指定的 id
- rust - `std::alloc::Allocator` 不满足
- flutter - Flutter : PageView.builder 到另一个页面
- spring-boot - 在 Spring Boot 中读取完整的查询参数字符串
- javascript - Javascript / HTML 问题:从表单中获取输入值,并使用它将用户发送到 URL
- create-react-app - 从 create-react-app 中的预缓存中过滤掉资产
- javascript - React Router:单击链接/按钮时如何重定向到不同的组件?
- opencl - 使用路径跟踪渲染体素时出现问题
- go - Go 中 *nameOfStruct 和 []nameOfStruct 的区别(* 和 [])
- interpolation - 如何让散景从 3 种颜色中插入调色板