在VS 2017中解决“节点的定义冲突”TS4090错误

17

我有一个TypeScript项目可以构建和运行,但是我有大量的构建错误,所有这些错误似乎都源自一个错误:

TS4090: (TS) 在'C:/[projectpath]/node_modules/@types/node/index.d.ts'和'C:/[user path to Microsoft]/Typescript/3.1/node_modules/@types/node/index.d.ts'找到了“node”的冲突定义。考虑安装此库的特定版本以解决冲突。

我不理解关于“安装此库的特定版本”的部分。我不确定为什么会发现两个版本。

我的应用程序在ClientApp文件夹中有一个tsconfig.json文件。它包含以下内容:

{
  "compileOnSave": false,
  "compilerOptions": {
    "module": "esnext",
    "skipLibCheck": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "sourceMap": true,
    "target": "es2015",
    "lib": [
        "es2016",
        "es2017",
      "dom"
    ],
    "moduleResolution": "node",
    "allowJs": true,
    "baseUrl": "src"
  },
  "include": [
    "./src/**/*.ts",
    "./test/**/*.ts",
    "./custom_typings/**/*.d.ts"
  ],
    "atom": {
        "rewriteTsconfig": false
    },
    "typeAcquisition": {"enable": false}
}

我最近根据其他帖子的评论添加了typeAcquisition,但是没有产生影响。

我需要做什么才能 "安装此库的特定版本"?

环境

该项目目标为.NetCore 2.2。该项目包含用Aurelia创建的SPA UI的ClientApp文件夹,以及提供后端数据的WebAPI Controllers。 我使用WebPack构建SPA应用程序。

错误

输入图像描述


2
尝试删除项目中的node_modules文件夹和package-lock.json文件,并从package.json中删除@types/node。使用“npm i”重新安装您的node-modules,使用“npm i @types/node --save-dev”重新安装您的节点类型作为开发依赖项。 - Michael Sorensen
不幸的是,这并没有解决任何问题。在VS2017中仍然会得到所有相同的TS错误。 - RHarris
1
我觉得追踪模块解析可能有助于你找到问题所在。如果将 "traceResolution": true 添加到 "compilerOptions" 中,你将会得到一个跟踪信息,了解 TypeScript 是如何确定要使用哪个模块的。TypeScript 文档 中的 注意事项 子节应该能帮助你理解这些输出。 - YardGnomeNinja
@YardGnomeNinja - 嘿,我想你刚在Aurelia Discourse论坛上帮了我一把——你在跟踪我吗(开玩笑):) 我按照你的建议添加了traceResolution,但我在哪里可以看到输出呢?我在构建输出中没有看到任何东西,也无法从命令窗口运行tsc - RHarris
我认为 MSBuild 不支持这个标志(traceResolution):https://apimirror.com/typescript/handbook/compiler-options-in-msbuild。 因此,在这种情况下您不能使用它。 - Mr Patience
6个回答

15

我通过移动解决了这个问题

"@types/node": "^10.11.6"

我需要在我的package.json文件中,将依赖项从devDependencies更改为peerDependencies

"peerDependencies": {
    "@types/node": "^10.11.6"
  },

5
你能提供更多有关移动的原因的信息吗?或者提供一个解释它的链接? - VinGarcia
文档是你的朋友: https://nodejs.org/ru/blog/npm/peer-dependencies/ - NordicShaw
@NordicShaw 这些文件记录了什么是同级依赖。但为什么在这里使用它是合适的呢?我以前从未见过 @types/ 类型的包作为 peerDependency - Peeja

12

对我来说,我通过在compilerOptions(tsconfig.json)中更改/添加"typeRoots"来解决了这个问题。

"compilerOptions": {
        ....
         "typeRoots": [
            "node_modules/@types"
        ]
        ....
}

0
如果您在两个不同的文件中导入mongoose,请确保使用相同的导入,例如在两个文件中都使用: const mongoose = require("mongoose");

0
对我来说,问题出在 karma.config 文件上。
在我删除了 package.json 中的一些类型后,我设法减少了错误数量,只剩下一个 - 在 signalrkarma 之间。

Screenshot of error

由于某些原因,我有一个 .js 的 karma 配置文件,而不是 .ts
在我切换到 正确的配置 并重新启动 VS 后,问题得到解决。

它需要一些版本的 node,因为使用了 require 函数。
我的理论是,Visual Studio 自动包含了可访问版本的 node 类型作为 JavaScript 的 linting 功能的一部分。
但随后,当它编译 TypeScript 时,另一个版本的 node 类型被包含了进来 - 与已经存在的冲突。

tsconfig.json 文件中的任何操作都不能解决这个问题,因为冲突存在于 TS 的 node 类型和 JS 的 node 类型之间。


0
在我的情况中,electronnode-opcua 两个包使用了不同的 @types/node 版本,导致了 "TS4090: (TS) Conflicting definitions for 'node" 错误。
我通过在 peerDependencies 中手动提供一个版本来成功修复错误,如错误信息所指出的那样,但是在其他地方安装项目后,这个版本发生了变化,结果证明这是一个坏主意。所以我在 package.json 中添加了 posinstall 脚本中的 npm dedupe,现在它工作得很好。
正如文档所述,它浏览整个依赖树,并通过将它们移动到上面来删除重复的包。

-1

通过修复解决了这个问题

rm -rf node_modules
rm package-lock.json
npm i

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接