Windows10环境AWS CDK TypeScript执行npm run build报TS编译错误
问题背景
参照AWS官方CDK v2 Hello World教程操作,在Windows 10系统中使用AWS CDK TypeScript框架开发时,执行npm run build构建命令出现一系列TypeScript编译错误,所有错误均来自node_modules目录下的@types/prettier类型定义文件,错误日志如下:
node_modules/@types/prettier/index.d.ts:41:54 - error TS2315: Type 'IsTuple' is not generic. 41 type IndexProperties<T extends { length: number }> = IsTuple<T> extends true ~~~~~~~~~~ node_modules/@types/prettier/index.d.ts:53:6 - error TS2456: Type alias 'IsTuple' circularly references itself. 53 type IsTuple<T> = T extends [] ? true : T extends [infer First, ...infer Remain] ? IsTuple<Remain> : false; ~~~~~~~ node_modules/@types/prettier/index.d.ts:53:65 - error TS2574: A rest element type must be an array type. 53 type IsTuple<T> = T extends [] ? true : T extends [infer First, ...infer Remain] ? IsTuple<Remain> : false; ~~~~~~~~~~~~~~~ node_modules/@types/prettier/index.d.ts:53:84 - error TS2315: Type 'IsTuple' is not generic. 53 type IsTuple<T> = T extends [] ? true : T extends [infer First, ...infer Remain] ? IsTuple<Remain> : false; ~~~~~~~~~~~~~~~ node_modules/@types/prettier/index.d.ts:96:5 - error TS2589: Type instantiation is excessively deep and possibly infinite. ~~~~ node_modules/@types/prettier/index.d.ts:131:5 - error TS2589: Type instantiation is excessively deep and possibly infinite. 131 each< ~~~~ node_modules/@types/prettier/index.d.ts:165:5 - error TS2589: Type instantiation is excessively deep and possibly infinite
报错原因
该问题由*@types/prettier版本与项目本地TypeScript版本不兼容*导致:3.x版本的@types/prettier使用了TypeScript 4.7及以上版本才支持的高级类型语法(包括递归元组判断、可变元组展开等特性),而AWS CDK TypeScript项目初始化时默认锁定的TypeScript版本普遍低于4.7,无法解析新版类型定义,从而抛出上述编译错误。
修复方案
按推荐优先级排序,可任选一种方案修复:
- 固定兼容版本的
@types/prettier(最稳妥,无副作用)
执行命令安装与低版本TypeScript兼容的2.x版本@types/prettier,覆盖依赖树中自动拉取的不兼容3.x版本:
安装完成后删除项目根目录下的npm install --save-dev @types/prettier@2.7.3node_modules文件夹和package-lock.json文件,重新执行npm install安装依赖,再运行npm run build即可正常构建。 - 开启第三方依赖类型检查跳过配置(最快修复)
修改项目根目录下的tsconfig.json文件,在compilerOptions配置项中添加skipLibCheck: true,跳过对node_modules下所有第三方类型定义文件的校验:
该配置不会影响业务代码的类型检查逻辑,是TypeScript项目的常用优化配置,保存后重新执行构建命令即可通过编译。{ "compilerOptions": { // 保留原有其他配置 "skipLibCheck": true } } - 升级本地TypeScript版本(适配新版类型定义)
如果项目允许调整TypeScript版本,可执行命令将本地TypeScript升级到4.7及以上版本,适配新版@types/prettier的语法要求:
注意升级TypeScript后可能需要同步升级对应版本的AWS CDK依赖,避免触发其他兼容性问题,升级前建议做好代码提交备份。npm install --save-dev typescript@^4.9
内容的提问来源于stack exchange,提问作者Shanthi
相关产品推荐
相关产品推荐

