定位TypeScript getAwaitedType系列递归调用触发最大栈溢出错误的原因
问题排查方案
该报错为TypeScript 4.4版本的已知边界缺陷,核心是内置Awaited类型推导嵌套Promise结构时未做递归终止判断,触发了调用栈溢出,和你场景中间接引入Promise相关类型的特征完全匹配。可按以下步骤定位具体触发代码:
- 缩小代码范围
逐块注释出现问题的TSX文件的import引入语句,每次注释后执行VS Code命令TypeScript: Restart TS Server重启语言服务,观察报错是否消失。当注释某段引入后问题不再出现,即可定位问题根源在对应引入的类型定义文件中。 - 排查可疑类型写法
打开定位到的类型定义文件,重点检查以下类型结构:- 直接/间接循环嵌套的Promise类型,例如
type BadType = Promise<BadType>,或者两个类型互相引用对方的Promise封装结构 - 自定义的Awaited工具类型,和内置类型推导逻辑冲突触发无限递归
- 泛型参数包含自身Promise封装的返回值类型
- 直接/间接循环嵌套的Promise类型,例如
- 验证问题根源
将可疑的类型临时修改为any,重启TS服务验证报错是否消失,确认后再优化类型逻辑即可。
快速规避方案
如果暂时不需要定位具体代码,可通过以下方法直接解决问题:
- 升级TypeScript版本到4.5及以上,该递归溢出问题已在TS 4.5版本被官方修复。如果不能全局升级项目TS版本,可在VS Code工作区单独指定高版本TS语言服务:工作区安装高版本TS依赖后,执行
TypeScript: Select TypeScript Version命令,选择工作区版本即可,不影响生产环境的编译配置。 - 若无法升级TS,可临时在
tsconfig.json的compilerOptions中添加"noStrictGenericChecks": true规避问题,该配置会关闭部分严格类型检查,仅建议临时使用。 - 若问题出在第三方依赖的类型定义中,可通过
patch-package工具给对应类型打补丁,删除不必要的嵌套Promise结构即可。
内容的提问来源于stack exchange,提问作者Brian M. Hunt
相关产品推荐
相关产品推荐

