如何在CJS优先的项目中导入.mts扩展名的文件?
解决TypeScript模块互操作错误(TS1479)
问题分析
你遇到的TS1479错误核心是CommonJS模块尝试导入ESM模块的冲突,即使在package.json添加了"type": "module",仍可能因为TypeScript的模块解析配置、文件扩展名不匹配导致问题。
解决方案
1. 统一文件扩展名与模块类型
- 确保导入方文件与被导入方的模块类型一致:
- 如果导入方是TypeScript文件,将扩展名改为
.mts(表示ESM类型的TS文件);如果是JavaScript文件,改为.mjs。 - 被导入的
fetchin.mts已经是ESM类型的TS文件,无需修改,但要确保编译后的输出文件扩展名对应为.mjs。
- 如果导入方是TypeScript文件,将扩展名改为
2. 调整tsconfig.json的模块配置
在compilerOptions中添加/修改以下配置,让TypeScript正确识别ESM模块:
{ "extends": "@tsconfig/node18/tsconfig.json", "compilerOptions": { "removeComments": false, "preserveConstEnums": true, "outDir": "lib/", "sourceMap": true, "esModuleInterop": true, "strict": true, "module": "NodeNext", "moduleResolution": "NodeNext" }, "ts-node": { "files": ["src/types/modules.d.ts"] } }
module: "NodeNext":让TypeScript采用Node.js的模块解析逻辑,适配ESM和CommonJS混合场景。moduleResolution: "NodeNext":配合module配置,根据文件扩展名和package.json的type字段自动识别模块类型。
3. 修正导入路径
开发时直接导入TypeScript源文件(.mts)而非编译后的.mjs文件,让TypeScript正确进行类型检查:
import { fetch } from "../utils/fetchin.mts";
如果是运行时导入编译后的文件,确保导入方也是ESM模块(比如.mjs或设置了type:module的文件)。
4. 关于降级@tsconfig/node18到node16的解释
这种说法的核心是Node16的TS配置默认启用了NodeNext模块解析,而早期的Node18配置可能默认使用CommonJS模块模式。但无需降级,只需按照上面的步骤调整自己的tsconfig即可,保持@tsconfig/node18能更好适配Node18的新特性。
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

