如何将node-fetch
包导入到我使用typescript
的节点项目中。我尝试了很多方法...现在我在:
const fetch = (...args) =>
import("node-fetch").then(({ default: fetch }) => fetch(...args));
但我有两个错误:
Cannot redeclare block-scoped variable 'fetch'.
以及
A spread argument must either have a tuple type or be passed to a rest parameter.
当我将const fetch =
更改为任何其他名称(如const fetchIt =
)时,它修复了第一个错误,但是...我真的必须更改它吗?我如何以正常方式导入node-fetch
包,在那里我可以使用fetch()
方法?在React中,我只需要
import fetch from 'node-fetch';
而且一切都很好...为什么在node
项目中这么难呢?
4条答案
按热度按时间u5rb5r591#
如果您与全局
fetch
有冲突,则建议您启用tsconfig.json
中的DOM
库,例如:我建议删除这个。对于NodeJS项目,根据NodeJS版本,查看this对建议的
tsconfig.json
设置的回答。在此之后,您将能够按照您在问题中所写的那样导入
fetch
,并将其赋值给名为fetch
的变量,而不会出现名称冲突:**替代解决方案:**如果您需要使用以浏览器为中心构建的第三方库,并且需要全局获取,请查看
isomorphic-fetch
模块,该模块添加了fetch
作为全局函数。您需要导入一次,以便
fetch
在全局可用:在这种情况下,
tsconfig.json
的编译器选项应该包含dom
库。更新日期:2022年2月4日
新的NodeJS版本现在提供了一个原生的
fetch
API,因此以后不再需要上面的API。更多信息请参见here和here。shyt4zoc2#
更新:
我下面的原始帖子都是真的。不过,我已经能够让它工作了,而不必切换到ESM模块。下面是我的代码中的工作原理(基于下面帖子中的第三个代码片段:https://github.com/node-fetch/node-fetch/issues/1279#issuecomment-915063354)
原始帖子:
Cannot redeclare block-scoped variable 'fetch'
错误是因为您声明了一个const fetch
变量,然后重用名称"fetch
"作为then()
回调的对象反结构化参数。因此,将该行更改为如下形式可清除该错误:
至于另一个错误(
A spread argument must either have a tuple type or be passed to a rest parameter.
),解决这个问题的一种可能方法是为fetch()
调用导入正确的参数类型,然后根据需要替换为上面的代码片段,如下所示:不幸的是,虽然这似乎满足了TypeScript编译器,但我在自己的代码中发现运行时仍然不工作(抛出
ERR_REQUIRE_ESM
),因为我的TypeScript配置当前使用的是CommonJS模块,而不是ESM格式。有关node-fetch包中与此问题相关的几个未决问题,请参见https://github.com/node-fetch/node-fetch/issues?q=ERR_REQUIRE_ESM。
本质上,节点获取维护者建议我们这些使用TypeScript的人需要转换到ESM模块,远离CommonJS(参见www.example.com和后续评论)。https://github.com/node-fetch/node-fetch/issues/1397#issuecomment-978092116 and subsequent comments).
qfe3c7zg3#
降级或安装v2.
npm install node-fetch@2 && npm install --save-dev @types/node-fetch@2.x
😡当node不支持ESM 3.x时,ESM 3.x有什么意义呢?至少对tsc是这样。也许ts-node支持它。但是tsc应该与ts-node兼容。
配置
注:节点14,将tsconfig从上述es 2019更新为es 2020并显示节点14
此外,Node 17+ fetch是内置的,因此当ESM在node中得到支持时,您可能不需要node-fetch。
yacmzcpb4#
我建议使用cross-fetch,它几乎是相同的,但在任何地方都适用,它帮助了我,因为我无法在TypeScript中运行节点获取