TypeScript中保留泛型类型封装函数的最优实现方案是什么?
解决方案
可以直接通过 TypeScript 内置的类型推导+typeof 关键字实现泛型透传,不需要重复声明泛型:
const func = <T, K>(a: T, b: object) => { // 原函数逻辑 }; // 直接将 wrappedFunc 类型标注为 typeof func,TS 会自动透传泛型声明 const wrappedFunc: typeof func = (a, b) => { return func(a, {name: 'john', ...b}); };
这种方式会完整继承原函数的泛型签名、参数类型、返回值类型,后续如果原函数的泛型约束、参数结构有调整,wrappedFunc的类型会自动同步,不需要手动维护,避免了重复声明带来的类型不一致隐患。
如果你的封装场景需要调整参数结构(比如新增/删除参数、修改参数可选性),可以配合Parameters和ReturnType工具类型实现:
type FuncType = typeof func; // 示例:把第二个参数调整为可选参数 const wrappedFunc = <T, K>(a: T, b?: Parameters<FuncType<T, K>>[1]): ReturnType<FuncType<T, K>> => { return func(a, {name: 'john', ...(b ?? {})}); };
效果验证
泛型能力会完全保留,类型校验正常生效:
// 传入泛型参数后,参数和返回值都会正常校验 const result = wrappedFunc<number, {id: string}>(123, {age: 20}); // 推导 result 类型为 {id: string},第一个参数校验为number类型,符合预期
内容的提问来源于stack exchange,提问作者nolan
相关产品推荐
相关产品推荐

