能否创建从外部对象属性推断类型的TypeScript泛型函数?
当然可以!我们只需要调整泛型的定义,让它能准确捕获传入 resolver 函数的参数类型和返回类型,就能实现完全的类型镜像效果。
修正后的 createResolver 实现
首先重构泛型函数,让它能适配任意函数类型并保留完整的类型信息:
function createResolver<T extends (...args: any[]) => any>(resolverFn: T): T { return (...args: Parameters<T>): ReturnType<T> => { // 在这里添加你的额外逻辑,比如日志、权限校验、参数预处理等 console.log("执行 resolver 前置逻辑..."); // 调用原始 resolver 函数并返回结果 return resolverFn(...args); } as T; }
关键类型逻辑解释
- 泛型
T被定义为任意函数类型(extends (...args: any[]) => any),这样它可以匹配任何带有参数和返回值的函数,不再局限于无参无返回的() => void。 - 返回类型直接设为
T,确保返回的函数和传入的resolverFn类型完全一致。 - 内部函数用
Parameters<T>自动提取T的参数类型数组,用ReturnType<T>提取T的返回类型,保证参数传递和返回值的类型安全。 - 最后用
as T做类型断言(这是安全的,因为我们的实现完全符合T的结构),帮助 TypeScript 确认返回值的类型就是T。
完整使用示例
const resolversMap = { overallRankingPlacement: createResolver((issuer: number, args: Record<string, any>, context: Record<string, any>) => { return Promise.resolve(0); // 返回与定义匹配的 Promise<number> }), }; // 此时类型推断完全生效: // resolversMap.overallRankingPlacement 的类型为: // (issuer: number, args: Record<string, any>, context: Record<string, any>) => Promise<number>
现在不管你传入什么样的 resolver 函数,createResolver 都会精准镜像它的参数类型、返回类型,完全满足你“类型层面全面镜像/代理”的需求,同时还能插入自定义的额外逻辑。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

