Lerna Monorepo中tsconfig.json继承引发TS18003错误排查
问题根源
TypeScript处理tsconfig继承时,include、exclude这类路径配置是相对于被继承的配置文件所在目录解析的,不是继承它的子包目录。你的基础配置在packages/tsconfig/tsconfig.json里,里面的"src/"会被解析成packages/tsconfig/src/,子包core继承后,路径就变成了相对于core的../tsconfig/src/,这才导致找不到输入文件的错误。
解决方案
方法1:用TypeScript 4.5+的${configDir}变量(推荐)
TypeScript 4.5及以上支持${configDir}占位符,它代表当前tsconfig文件所在的目录(也就是子包自己的目录)。修改基础配置:
// packages/tsconfig/tsconfig.json { "extends": "@sindresorhus/tsconfig", "compilerOptions": { "outDir": "dist" }, "include": [ "${configDir}/src/" ] }
子包继承后,${configDir}会自动替换成子包的目录路径,最终include就指向子包自己的src/,完美解决路径问题。
方法2:子包手动覆盖include
如果你的TypeScript版本低于4.5,直接在每个子包的tsconfig里显式写include,覆盖基础配置的路径:
// packages/core/tsconfig.json { "extends": "tsconfig", "include": [ "./src/" ] }
这种方式需要每个子包都配置,但兼容性拉满,适合老版本项目。
方法3:调整基础配置位置
把基础tsconfig移到仓库根目录,命名为tsconfig.base.json,然后子包继承根目录的配置:
// 根目录tsconfig.base.json { "extends": "@sindresorhus/tsconfig", "compilerOptions": { "outDir": "dist" } }
// packages/core/tsconfig.json { "extends": "../../tsconfig.base.json", "include": [ "./src/" ] }
这种方式绕开了路径解析的坑,适合不想依赖新特性的场景。
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

