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

使用TypeScript+nodemon+ts-node时,添加'type: module'至package.json后出现.ts文件未知扩展名错误求助

问题原因分析

当你在package.json中添加"type": "module"后,Node.js会默认把所有文件当作ES模块来处理,但Node本身并不认识.ts文件扩展名——它只会尝试解析.js、.mjs等原生支持的ES模块格式。

之前没加这个配置时,Node默认使用CommonJS模块系统,ts-node会自动把.ts文件转译为CommonJS格式的代码交给Node执行,所以一切正常。但切换到ES模块模式后,ts-node需要明确收到“要处理ES模块类型的.ts文件”的指令,否则Node会直接尝试读取.ts文件,从而抛出ERR_UNKNOWN_FILE_EXTENSION错误。

哪怕你清空.ts文件只留console.log,只要"type": "module"存在,Node就会以ES模块模式处理文件,它不认识.ts扩展名,自然报错。

解决方案

你可以通过以下两种方式解决这个问题:

方式一:在启动命令中给ts-node添加--esm参数

修改你的nodemon启动命令,明确告诉ts-node要启用ES模块支持:

nodemon --exec ts-node --esm src/file.ts

这个参数会让ts-node在ES模块模式下处理.ts文件,和package.json中的"type": "module"配置适配。

方式二:在tsconfig.json中配置ts-node的ES模块模式

如果你不想每次命令行加参数,可以在tsconfig.json中添加ts-node的配置块,指定启用ES模块:

{
  "compilerOptions": {
    // 确保TypeScript输出ES模块格式
    "module": "ESNext",
    "moduleResolution": "NodeNext",
    "target": "ES2020", // 至少ES2020以上,支持ES模块特性
    // 你的其他编译配置
  },
  "ts-node": {
    "esm": true
  }
}

这样配置后,直接运行原来的nodemon命令即可,ts-node会自动以ES模块模式处理文件。

额外注意事项

  • 确保你的tsconfig.json中的module和moduleResolution设置和ES模块兼容,比如"module": "ESNext" + "moduleResolution": "NodeNext"是比较推荐的组合。
  • 如果你使用的是较新版本的ts-node,可能已经默认支持ES模块,但还是需要明确配置来和package.json的"type": "module"对齐。

内容的提问来源于stack exchange,提问作者Timmiej93

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:22:34