TypeScript使用require引入node-fetch报ts2349错误,import正常如何解决?
问题产生原因
node-fetch 3.x及以上版本是纯ESM规范包,仅支持ESM标准的导入语法,其TypeScript类型定义也完全匹配ESM规范:
- 你用
import fetch from 'node-fetch'属于ESM默认导入语法,会自动匹配模块的default导出项,拿到的就是可调用的fetch函数,因此运行正常。 - 你用CommonJS的
const fetch = require('node-fetch')导入时,实际得到的是一个包含default属性的模块对象,而非直接的fetch函数,直接调用整个对象就会触发「没有调用签名」的TS2349报错。
修复方案
你可以根据自己的项目规范选择任意一种方案:
- 方案1:项目采用ESM规范(package.json中配置
"type": "module",tsconfig中module字段配置为ESNext/ES2020及以上),直接保留import fetch from 'node-fetch'的导入写法即可,这也是node-fetch官方推荐的用法。 - 方案2:项目必须使用CommonJS规范,修改require导入写法,手动取default导出项:
同时确认tsconfig.json中已开启const fetch = require('node-fetch').default;esModuleInterop: true,开启ESM和CommonJS模块互导的兼容性支持。 - 方案3:降级node-fetch到2.x版本,2.x版本同时兼容ESM和CommonJS规范,无需修改原有导入写法:
npm install node-fetch@2 # TS项目需要同步安装对应版本的类型定义 npm install @types/node-fetch@2 -D
内容的提问来源于stack exchange,提问作者Oba Api
相关产品推荐
相关产品推荐

