TurboRepo Monorepo从Yarn转pnpm后遇mime类型声明缺失问题
在TurboRepo monorepo中从Yarn切换到pnpm后遇到TS7016类型声明错误
执行lint或build命令时出现如下错误:
../../node_modules/.pnpm/@types+serve-static@1.15.5/node_modules/@types/serve-static/index.d.ts:4:20 - error TS7016: Could not find a declaration file for module 'mime'. '/path-to-project/node_modules/.pnpm/mime@3.0.0/node_modules/mime/index.js' implicitly has an 'any' type.
问题背景
排查发现依赖链中引入了已废弃的@types/mime(npm官方说明:mime自身已提供类型定义,此包为冗余存根)。Yarn环境下无此问题,新建pnpm+express项目也未复现该问题。
依赖链路径:
firebase-functions@4.8.2 --> @types/express@4.17.3 --> @types/serve-static@1.15.5 --> @types/mime@4.0.0
已尝试的操作:
pnpm store prune- 重新安装pnpm
- 重新安装root/apps/project下的依赖包
- 多次清理项目缓存、node_modules及.lock文件后重新安装所有依赖
使用的pnpm版本:v8.15.5
相关配置文件
root/apps/project/tsconfig.json
{ "compilerOptions": { "module": "commonjs", "noImplicitReturns": true, "noUnusedLocals": true, "outDir": "lib", "sourceMap": true, "strict": true, "target": "es2017" }, "compileOnSave": true, "include": [ "src" ] }
root/apps/project/package.json
"dependencies": { "firebase-admin": "^12.0.0", "firebase-functions": "^4.8.2" }, "devDependencies": { "event-dee-types": "workspace:*", "firebase-functions-test": "^3.1.1", "typescript": "^4.9.0" },
root/package.json
"dependencies": { "daisyui": "4.6.0", "dotenv-cli": "^7.2.1", "next": "latest", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { "@types/node": "^20.10.4", "@types/react": "^18.0.22", "@types/react-dom": "^18.0.7", "autoprefixer": "^10.4.14", "eslint": "^7.32.0", "eslint-config-custom": "workspace:*", "postcss": "^8.4.21", "sass": "^1.62.0", "tailwindcss": "^3.3.1", "turbo": "latest", "typescript": "^5.0.4" }
解决方案
1. 强制禁用冗余的@types/mime依赖
在项目根目录的package.json中添加pnpm.overrides配置,强制忽略@types/mime:
{ "pnpm": { "overrides": { "@types/mime": "false" } } }
或者将其映射到mime自身的包,确保使用内置类型:
{ "pnpm": { "overrides": { "@types/mime": "npm:mime@^3.0.0" } } }
2. 更新依赖版本
升级firebase-functions到最新版本,新版本可能已修复依赖链中引入过时类型包的问题;同时升级@types/express和@types/serve-static到兼容mime v3的版本,避免依赖旧类型定义。
3. 调整TypeScript配置
在root/apps/project/tsconfig.json的compilerOptions中添加types字段,明确指定需要加载的类型包:
{ "compilerOptions": { // 原有配置... "types": ["node", "express"] } }
作为临时方案,可启用skipLibCheck跳过库类型检查(不推荐长期使用):
{ "compilerOptions": { // 原有配置... "skipLibCheck": true } }
4. 调整pnpm依赖解析配置
在根目录的.npmrc或pnpmrc中添加如下配置,确保类型包被正确提升:
public-hoist-patterns[]=@types/*
内容的提问来源于stack exchange,提问作者andyoee
相关产品推荐
相关产品推荐

