无法在 TypeScript 中导入模块

cannot import module in TypeScript

我知道有很多主题是关于如何通过 NPM 将依赖项导入 TypeScript 的。我尝试执行以下操作

npm install --save node-fetch

然后 import * as fetch from 'node-fetch 在我的 app.ts.

为了在我的代码中使用 fetch

但是我无法在我的代码中使用该库,并且出现以下错误:

Error TS2307 (TS) Cannot find module 'node-fetch'.

我查看了 node_modules 下加载的模块并在那里找到了 node-fetch,因此我假设 lib 已成功安装。许多提到的主题还提到了一些 tsconfig 文件,我无法在我的项目中找到它。 VS 似乎对如何实现 TypeScript 的设置有自己的想法,这些设置位于我的 csproj 文件中:

<TypeScriptLib>es2015</TypeScriptLib>
<TypeScriptTarget>ES5</TypeScriptTarget>
<TypeScriptJSXEmit>None</TypeScriptJSXEmit>
<TypeScriptModuleKind>ES2015</TypeScriptModuleKind>
<TypeScriptCompileOnSaveEnabled>True</TypeScriptCompileOnSaveEnabled>
<TypeScriptNoImplicitAny>False</TypeScriptNoImplicitAny>
<TypeScriptRemoveComments>False</TypeScriptRemoveComments>
<TypeScriptOutFile />
<TypeScriptOutDir />
<TypeScriptGeneratesDeclarations>False</TypeScriptGeneratesDeclarations>
<TypeScriptNoEmitOnError>True</TypeScriptNoEmitOnError>
<TypeScriptSourceMap>True</TypeScriptSourceMap>
<TypeScriptMapRoot />
<FilesToIncludeForPublish>AllFilesInTheProject</FilesToIncludeForPublish>

我也为其他库得到了这个,例如leaflet-geosearch

这是我的 package.json:

{
  "name": "myproject",
  "version": "1.0.0",
  "devDependencies": {
    "@types/d3": "^5.7.2",
    "@types/jquery": "^3.3.32",
    "@types/leaflet": "^1.5.8",
    "@types/leaflet-geosearch": "^2.7.1",
    "d3": "^5.15.0",
    "jquery": "^3.4.1",
    "leaflet": "^1.6.0",
    "leaflet-geosearch": "^2.7.0",
    "node-fetch": "^2.6.0"
  }
}

我已经删除了全局 npm-modules,如 所示,并再次将 node-fetch 安装到本地项目中,但无济于事。

TL;DR

您缺少 node-fetch 的类型,您应该像这样安装它们:

npm i --save-dev @types/node-fetch

说明

一些包带有自己的打字,一些将打字作为单独的包发布,另一些则有第三方创建的打字(node-fetch 包是 created by David Frank, whereas the @types/node-fetch is maintained by DefinitelyTyped and the node-fetch types have been created by many people), some packages have no public typings at all (usually more isoteric packages) and you can create your own typings declarations

其他一些观察结果

随意跳过...

您似乎混淆了 dependenciesdevDependenciesdependencies 应包括运行时应存在的所有包(例如 node-fetch 在您的情况下),而 devDependencies 是构建时所需的 附加 依赖项(例如,任何 @types 包或任何 用于构建项目的包,如 webpack/grunt(如果适用)。

所以所有这些,可能应该移动到 dependencies:

"d3": "^5.15.0",
"jquery": "^3.4.1",
"leaflet": "^1.6.0",
"leaflet-geosearch": "^2.7.0",
"node-fetch": "^2.6.0"

最后,如果这是一个 nodejs(即不是基于浏览器的项目)项目,您可能应该使用 CommonJSES6 模块类型而不是 ES2015。参见 here。 如果它 浏览器项目,您可能不应该使用 node-fetch;而是将 DOM 添加到您的打字稿库列表中,并使用从 window.fetch 或仅 fetch 获取,因为它将成为全局范围的一部分。