【问题标题】:cannot import module in TypeScript无法在 TypeScript 中导入模块
【发布时间】:2020-06-06 23:09:15
【问题描述】:

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

npm install --save node-fetch

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

为了在我的代码中使用fetch

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

错误 TS2307 (TS) 找不到模块“node-fetch”。

我查看了node_modules 下的已加载模块,并在那里找到了node-fetch,因此我假设该库已成功安装。许多前面提到的线程还提到了一些tsconfig-file,我在我的项目中找不到。似乎 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"
  }
}

我已经删除了https://stackoverflow.com/a/15597395/2528063 所示的全局 npm-modules 并再次将node-fetch 安装到本地项目中,但无济于事。

【问题讨论】:

  • 只需使用 VS Code。当你在命令行运行tsc 时,它会说什么?这消除了 VS。
  • github.com/tomdale/ember-network/issues/10 - 这也是你的问题吗?没有在正确的文件夹中运行 npm install。
  • @JGFMK 老实说,我对 TypeScript 了解不多,但我很确定我的堆栈中没有任何快速启动。
  • 我用 npm 做了一些事情。几年前使用 Ionic 开发 - 和一些 Angular。您通常会设置一个项目 - 然后在您的项目结构中运行命令。因此,您为框架进行了第一次安装 - 在您的项目中进行了第二次安装,您已经获得了 package.json。您确定您没有混淆在项目文件夹中安装框架之类的操作 - 反之亦然。这也是我一直在逃避的。链接中的评论足以激发这种思路。全局安装与本地项目。您也可以在安装过程中更新项目 package.json。
  • @JGFMK 将框架安装到项目中?你指的是哪个框架?不过,我附加了我的 package.json。

标签: typescript visual-studio-2017


【解决方案1】:

TL;DR

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

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

说明

一些包带有自己的类型,一些作为单独的包发布类型,另一些具有由第 3 方创建的类型(node-fetch 包是 created by David Frank,而 @types/node-fetchDefinitelyTyped 和node-fetch 类型一直是created by many people),一些包根本没有公共类型(通常是更多的等量包),你可以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 添加到您的 typescript 库列表中,并使用 fetch from window.fetch 或仅使用 fetch,因为它将是全局范围的一部分。

【讨论】:

  • “如果它是浏览器项目,您可能不应该使用 node-fetch” 这似乎是我的实际问题。如何在浏览器中fetch
  • 见这里:developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch 只需将DOM 添加到您的TypeScriptLibs,您将在全局范围(即仅使用fetch)或在window 对象(即window.fetch
  • aaaah,我不知道在服务器端或客户端使用 JS 会有什么不同。对我来说,它一直只是客户端。谢谢你的解释。
  • @HimBromBeere 使用 npm install 仅将模块安装到当前目录(在名为 node_modules 的子目录中)。 app.js 是否位于 home/dave/src/server/ 下?如果没有并且您想使用任何目录中的模块,则需要使用 npm install -g 全局安装它。
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2012-10-09
  • 2018-11-01
  • 1970-01-01
  • 2014-05-27
  • 2023-03-09
相关资源
最近更新 更多