如何对含多项目的TypeScript monorepo进行全文件类型检查
pnpm TypeScript Monorepo命令行类型检查方案问题
背景
我正在维护一个使用pnpm搭建的TypeScript monorepo。TypeScript文件分布在以下位置:
- 项目源代码文件(
packages/*/src/**/*.ts); - 仓库根目录下的配置文件(
*.ts); - 项目文件夹根目录下的配置文件(
packages/*/*.ts); - Cypress测试用例及配置文件(
cypress/**/*.ts)。
当我在VS Code中打开这些文件时,希望TypeScript语言服务能对文件进行类型检查,以便编辑器能标注出问题。
为实现这一点,我在仓库根目录创建了tsconfig.json,配置了对monorepo中所有TS文件的严格类型检查(排除node_modules),内容如下:
{ "compilerOptions": { "strict": true, "noEmit": true, ... // 更多配置项 } }
为让VS Code能正确检查项目文件夹中的源代码文件,尤其是确保每个项目仅加载相关的@types包,我在每个项目文件夹中放置了继承根目录tsconfig.json的tsconfig.json文件:
{ "extends": "../../tsconfig.json" }
cypress文件夹中的
tsconfig.json有一些额外配置,但核心逻辑一致。
目前,monorepo已配置好VS Code中的类型检查,打开任意.ts文件时,语言服务都能正确报告类型问题。
需求
现在我需要能从命令行对整个monorepo进行类型检查,需满足以下条件:
- 所有开头列出的TS文件都要被类型检查;
- 仅对开头列出的TS文件进行类型检查;
- 保持项目间的类型检查隔离(即检查
foo项目的源代码时,仅包含packages/foo/package.json中列出的包及packages/foo/node_modules下安装的@types包和类型定义); - 同一文件不会被重复类型检查(节省时间,避免重复报错)。
已尝试的方法(均至少不满足一项需求)
方法1:tsc --project tsconfig.json
- 通过:根目录
tsconfig包含仓库中除node_modules外的所有.ts文件。 - 未通过:输出目录(
dist、build、out等)中的.ts文件也会被检查。 - 未通过:所有
@types包和类型定义都会被加载,破坏项目间隔离,导致全局类型冲突(如Cypress与Jest),使类型检查不可靠。 - 通过:
tsc仅运行一次,无重复检查问题。
方法2:tsc --project tsconfig.check.json
其中tsconfig.check.json内容如下:
{ "extends": "./tsconfig.json", "include": ["*.ts", "packages/*/*.ts", "packages/*/src/**/*.ts", ...] }
- 通过
- 通过:虽繁琐且易遗漏同步,但能生效
- 未通过:仍无法保持项目间隔离
- 通过
方法3:tsc -p tsconfig.check.json && tsc -p packages/foo/tsconfig.json && ...
根目录tsconfig.check.json仅包含["*.ts"],项目的tsconfig.json修改为包含["*.ts", "src/**/*.ts"]。
每个项目的
tsc命令可放入NPM脚本,利用pnpm的递归运行脚本能力。
- 通过
- 通过:未包含输出目录
- 通过:
tsconfig.check.json不包含项目文件,各项目的tsconfig.json互斥(不包含其他项目的文件) - 未通过:若项目
foo导入项目bar的文件,且tsc同时运行于两个项目,则导入的文件会被检查两次;若仅运行foo的tsc,bar中未被foo导入的文件(如测试文件)不会被检查。
TypeScript项目引用
目前tsc --build --noEmit尚未被支持。
问题
如何才能让该monorepo满足上述所有四个条件?
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

