You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CJS优先的项目中导入.mts扩展名的文件?

解决TypeScript模块互操作错误(TS1479)

问题分析

你遇到的TS1479错误核心是CommonJS模块尝试导入ESM模块的冲突,即使在package.json添加了"type": "module",仍可能因为TypeScript的模块解析配置、文件扩展名不匹配导致问题。

解决方案

1. 统一文件扩展名与模块类型

  • 确保导入方文件与被导入方的模块类型一致:
    • 如果导入方是TypeScript文件,将扩展名改为.mts(表示ESM类型的TS文件);如果是JavaScript文件,改为.mjs。
    • 被导入的fetchin.mts已经是ESM类型的TS文件,无需修改,但要确保编译后的输出文件扩展名对应为.mjs。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:22:12