单仓升级React 18遇useTransition类型错误问题排查与优化方案
问题原因
根目录的resolutions(或pnpm的overrides)配置优先级远高于子项目的devDependencies,它会强制整个monorepo所有项目统一使用指定版本的@types/react。你在根目录设置了@types/react: "^17",哪怕newProject的devDependencies里写了18版本,包管理器也会忽略子项目的配置,强制给newProject安装v17的类型定义——而useTransition是React18新增的Hook,v17的类型库里根本没有这个类型,自然会报错。
更优实现方式
1. 针对单个子项目覆盖根级resolutions
如果旧项目还需要保留v17的@types/react,可以在根目录的package.json里给newProject单独配置例外:
"resolutions": { "@types/react": "^17", "@types/react-dom": "^17", // 给newProject单独指定React18的类型 "newProject/@types/react": "^18", "newProject/@types/react-dom": "^18" }
(注:如果用pnpm,把resolutions换成pnpm.overrides)
2. 取消全局强制,让子项目各自管理依赖
如果大部分项目都要升级到React18,或者旧项目可以自行锁定v17版本,直接删除根目录的@types/react resolutions配置。每个项目在自己的package.json里明确指定所需版本:
- 旧项目:
devDependencies里保留@types/react: "^17" - newProject:
devDependencies里设置@types/react: "^18"、@types/react-dom: "^18"
这样包管理器会根据每个子项目的配置安装对应版本,自动隔离不同版本的类型定义。
3. 清理依赖缓存并重新安装
修改配置后,一定要清理包管理器的缓存,避免残留旧版本的依赖:
- Yarn:
yarn cache clean && yarn install - pnpm:
pnpm store prune && pnpm install - npm:
npm cache clean --force && npm install
额外注意
确保newProject里的react、react-dom版本和@types/react、@types/react-dom版本完全匹配(比如都是18.2.x),类型定义和库版本不一致也会导致各种类型错误。
内容的提问来源于stack exchange,提问作者GRZa
相关产品推荐
相关产品推荐

