TypeScript中函数返回类型能否用于自身参数定义及类型推导问题
TypeScript 函数返回类型复用参数定义的解决方案
你遇到的loop返回类型推导为any的问题,本质是原泛型定义存在循环依赖导致TypeScript类型推导优先级失效,调整泛型结构即可解决。
问题原因
原泛型定义中B的约束依赖C,C的约束又反向依赖B的返回值,TypeScript处理调用时会优先推导输入类型A和handler对应的B,此时C还未完成推导,导致handler内部的loop参数返回类型被默认判定为any。
修复后的代码
核心函数定义
function chain<A, C>(input: A, handler: (input: A, loop: (input: A) => C) => C): C { const loop = (input: A): C => handler(input, loop); return loop(input); }
简化后仅保留输入类型A和最终返回类型C两个泛型参数,直接将handler的类型和loop返回类型绑定,消除循环推导依赖。
调用验证
// 模拟外部异步依赖 function someExternalThing(): Promise<boolean> { return Promise.resolve(Math.random() > 0.5); } chain('test', async (value, loop): Promise<string> => { const ready = await someExternalThing(); if (ready) { return value; } else { // 此时loop的类型会被正确推导为 (input: string) => Promise<string>,无any类型问题 return await loop(value + '!'); } });
调整后不需要额外显式传入泛型参数,只要你为handler函数定义了明确的返回类型,TypeScript会自动完成所有类型推导,完全符合类型安全要求。
内容的提问来源于stack exchange,提问作者spacefluff432
相关产品推荐
相关产品推荐

