TypeScript忽略esModuleInterop,CommonJS项目无法引入lowdb如何解决?
解决步骤
1. 确认tsconfig.json核心配置有效性
确保你的tsconfig.json关键配置正确,且未被其他配置文件覆盖:
{ "compilerOptions": { "target": "ES2020", // 选兼容的较高版本即可 "module": "CommonJS", // 明确指定编译目标为CommonJS "esModuleInterop": true, "allowSyntheticDefaultImports": true, "moduleResolution": "NodeNext" // 提升ESM与CommonJS混合场景的解析兼容性 } }
注意:如果项目存在多份tsconfig(如tsconfig.node.json),要检查这些文件是否继承了主配置,或是单独将esModuleInterop设为了false。
2. 适配lowdb的ESM特性
lowdb从v3版本开始是纯ESM模块,即使开启esModuleInterop,直接默认导入仍可能在CommonJS环境报错,可改用以下两种导入方式:
- 命名导入(推荐):
import { Low } from 'lowdb' import { JSONFile } from 'lowdb/node'
- 动态导入(适合CommonJS环境调用ESM模块):
async function initDatabase() { const { Low, JSONFile } = await import('lowdb') const adapter = new JSONFile('db.json') const db = new Low(adapter) await db.read() // 后续数据库操作 }
3. 验证TS配置是否被正确读取
若编译后的js文件未生成__importDefault辅助函数,大概率是TS没读取到你的配置:
- 编译时显式指定配置文件:
tsc --project tsconfig.json - 确认
tsconfig.json在项目根目录,避免放在子目录导致TS自动识别失败
4. 调整package.json的模块类型
如果你的package.json设置了"type": "module",会强制项目使用ESM,与编译为CommonJS的需求冲突。确保:
{ "type": "commonjs" // 或直接删除该字段,默认即为commonjs }
5. 更新TypeScript版本
旧版TS对esModuleInterop的处理可能存在bug,建议更新至最新稳定版:
npm install typescript@latest --save-dev
内容的提问来源于stack exchange,提问作者nulkode
相关产品推荐
相关产品推荐

