升级MUI至v5.14.18后出现TS1005类型错误求助
问题详情
将项目从MUI v5.8.1升级至v5.14.18后,执行tsc命令时出现如下TypeError:
../../node_modules/@mui/material/ClickAwayListener/index.d.ts:1:45 - error TS1005: ',' expected.
export { ClickAwayListener as default, type ClickAwayListenerProps, } from '@mui/base/ClickAwayListener';
~~~~~~~~~~~~~~~~~~~~~~Found 1 error.
当前环境版本:
- TypeScript: 4.3.5
- Node: 18.17.1
- @mui/material: 5.14.18
已在tsconfig.json中设置skipLibCheck: true并排除node_modules,但错误依然存在;手动移除类型导出语句中的type关键字可消除错误。
解决方案
1. 升级TypeScript版本
错误根源是TypeScript 4.3.5不支持type关键字在导出解构中的语法,该特性从TypeScript 4.5版本开始引入。直接将TypeScript升级到4.5.x及以上稳定版本(推荐升级到匹配MUI v5.14.x的TS版本,比如4.9+),即可兼容该语法,无需修改第三方库代码。
2. 临时补丁方案(不升级TS时)
如果暂时无法升级TypeScript,可使用patch-package给@mui/material打本地补丁:
- 安装patch-package:
npm install patch-package --save-dev - 打开
node_modules/@mui/material/ClickAwayListener/index.d.ts,将代码修改为:export { ClickAwayListener as default, ClickAwayListenerProps, } from '@mui/base/ClickAwayListener'; - 执行
npx patch-package @mui/material生成补丁文件 - 后续执行
npm install时,补丁会自动应用到依赖包中
关于skipLibCheck未生效的说明
skipLibCheck: true仅跳过对.d.ts文件的类型检查,但如果第三方库的.d.ts文件存在语法错误(而非类型不兼容),TS编译器依然会报错,因为语法错误会阻断编译流程。这也是即使设置了该选项仍出现错误的原因。
内容的提问来源于stack exchange,提问作者Eric Barbour

