Yarn Berry共享脚本:如何避免子包依赖重复及解决类型报错
Yarn Berry工作区集中管理@types依赖的类型错误解决办法
先说结论
不用在每个子工作区单独声明@types/*类依赖,只要把TypeScript的类型解析和Yarn工作区的依赖可见性配置对就行。
为啥会出这些错
- TS2688错误:子工作区的TypeScript默认不会自动往上查找父工作区里的
@types/node类型定义,所以找不到对应的类型文件。 - TS2584错误:你删除
tsconfig里的types配置后,TypeScript的默认类型加载逻辑被打乱,再加上父工作区的类型依赖没被正确识别,连console这种全局API的类型都找不到了。
具体解决步骤
1. 让父工作区的依赖对子工作区可见
父工作区的package.json里,把typescript、@types/node这些依赖放在devDependencies中,同时确保工作区配置正确:
{ "name": "@repro/packages", "private": true, "workspaces": ["packages/*"], "devDependencies": { "typescript": "4.9.5", "@types/node": "18.x" } }
子工作区的package.json无需重复声明这些依赖,只要指定好共享脚本和Yarn版本即可:
{ "name": "@repro/package", "private": true, "scripts": { "build": "yarn p:tsc" }, "packageManager": "yarn@3.3.1" }
2. 给TypeScript指明类型文件的位置
在子工作区的tsconfig.json里,用typeRoots指向父工作区的@types目录,再显式指定需要加载的node类型:
{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "node", "typeRoots": [ "../../node_modules/@types", // 指向父工作区的类型目录 "./node_modules/@types" ], "types": ["node"], "strict": true, "outDir": "./dist" }, "include": ["src/**/*"] }
如果所有子工作区的TS配置差异不大,推荐在父工作区创建tsconfig.base.json,子工作区直接继承:
// 父工作区 tsconfig.base.json { "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "node", "typeRoots": ["./node_modules/@types"], "types": ["node"], "strict": true } } // 子工作区 tsconfig.json { "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist" }, "include": ["src/**/*"] }
3. 验证配置是否生效
运行yarn workspaces info查看子工作区能否正确识别父工作区的依赖,再在子工作区执行yarn dlx tsc --noEmit测试类型解析,确认错误是否消失。
额外提醒
- 确保Yarn零安装的缓存目录(
.yarn/cache)未损坏,若有问题可删除后重新拉取依赖。 - 如果子工作区有特有的类型依赖(比如
@types/react),可将通用类型依赖放在父工作区,子工作区仅添加自身需要的类型依赖。 - 不要把子工作区
tsconfig中的typeRoots仅设置为当前目录,否则会屏蔽父工作区的类型依赖。
内容的提问来源于stack exchange,提问作者giovai
相关产品推荐
相关产品推荐

