TypeScript中从callApi返回值推断transformResponse参数类型问题
解决中间件中
transformResponse的类型自动推断问题 懂了!你现在遇到的问题就是想让transformResponse的参数类型能自动跟着callApi的返回值类型走,但原来的类型定义里的P泛型没做好关联,导致推断失效对吧?我之前写类似的API封装时也踩过这个泛型的坑,咱们来一步步搞定它:
先上正确的类型定义写法
// 给中间件配置定义带泛型的接口,泛型关联callApi的返回类型 interface MiddlewareConfig<ApiRes> { // callApi 明确返回 Promise<ApiRes>,把泛型绑定到返回值上 callApi: () => Promise<ApiRes>; // transformResponse 的 payload 直接复用这个泛型,自动关联类型 transformResponse?: (payload: ApiRes) => any; } // 中间件的核心实现,用泛型承接配置的类型 const createMiddleware = <T>(config: MiddlewareConfig<T>) => { return async () => { const apiResult = await config.callApi(); return config.transformResponse ? config.transformResponse(apiResult) : apiResult; }; };
为什么原来的写法无效?
你提到的内部P类型有问题,大概率是因为原来的泛型定义是把P当成了独立的参数,没有和callApi的返回值做绑定。比如错误的写法可能是这样的:
// 反面例子:泛型P和callApi的返回值完全脱节 interface BadMiddlewareConfig<P> { callApi: () => Promise<any>; // 这里没把P和返回值关联 transformResponse?: (payload: P) => any; }
这种情况下TypeScript根本不知道P应该对应callApi返回的什么类型,自然没法自动推断。
核心改进思路
把泛型直接绑定到callApi的Promise返回值上,让TypeScript能从callApi的定义里自动提取出这个类型,再把它传给transformResponse的参数。这样两者的类型就牢牢关联起来了,不需要额外的独立泛型参数。
实际使用效果演示
当你传入具体的callApi实现时,transformResponse的参数类型会自动被推断出来:
// 示例:callApi返回一个用户信息对象 const userMiddleware = createMiddleware({ callApi: async () => ({ id: 123, username: "johndoe", email: "john@example.com" }), // 这里payload会自动推断为{ id: number; username: string; email: string } transformResponse: (payload) => ({ userId: payload.id, userEmail: payload.email }) });
完全不需要手动指定类型,TypeScript会帮你搞定所有推断工作。
内容的提问来源于stack exchange,提问作者Tarlen
相关产品推荐
相关产品推荐

