【问题标题】:Resolve 'Conflicting definitions for node' TS4090 error in VS 2017解决 VS 2017 中的“节点定义冲突”TS4090 错误
【发布时间】:2022-04-12 20:37:43
【问题描述】:

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

TS4090:(TS) 在“C:/[projectpath]/node_modules/@types/node/index.d.ts”和“C:/[Microsoft 的用户路径]/Typescript 中找到的“节点”定义冲突/3.1/node_modules/@types/node/index.d.ts'。考虑安装此库的特定版本来解决冲突。

我不明白“安装这个库的特定版本”。我不确定为什么会找到两个版本。

我的应用在 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}
}

我最近根据 cmets 在与此相关的其他帖子上添加了typeAcquisition - 但它没有任何影响。

“安装此库的特定版本”我需要做什么?

环境

该项目针对 .NetCore 2.2。该项目包含提供后端数据的 WebAPI 控制器以及包含使用 Aurelia 创建的 SPA UI 的 ClientApp 文件夹。我使用 WebPack 来构建 SPA 应用程序。

错误

【问题讨论】:

  • 尝试删除 node_modules 文件夹删除项目中的 package-lock.json 文件并从 package.json 中删除 @types/node。重新安装。使用npm i 的节点模块并使用npm i @types/node --save-dev 重新安装您的节点类型作为开发依赖项
  • 不幸的是,这并没有解决任何问题。在 VS2017 中仍然出现所有相同的 TS 错误
  • 我认为跟踪模块分辨率可能会帮助您跟踪它。如果将"traceResolution": true 添加到"compilerOptions",您将了解 TS 如何确定要使用的模块。 This section of the TS documentation,特别是 注意事项 小节,应该可以帮助您确定输出的正面或反面。
  • @YardGnomeNinja - 嘿,我想你刚刚在 Aurelia Discourse 论坛上帮助了我 - 你在跟踪我吗 (jk) :) 我按照你的建议添加了 traceResolution - 我在哪里看到输出?我在构建输出中看不到任何内容,而且我似乎无法从命令窗口运行 tsc
  • 我认为 MSBuild 不支持此标志 (traceResolution):apimirror.com/typescript/handbook/compiler-options-in-msbuild。所以在这种情况下你不能使用它

标签: typescript visual-studio-2017 aurelia


【解决方案1】:

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

"@types/node": "^10.11.6"

devDependencies 到我的package.json 文件中的peerDependencies

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

【讨论】:

【解决方案2】:

对我来说,我通过 compilerOptions (tsconfig.json) 中的 change/add "typeRoots" 修复了它

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

【讨论】:

    【解决方案3】:

    对我来说,是 karma.config 文件导致了问题。

    在我删除了package.json 中的一些类型之后,我设法减少了错误的数量,并且只有一个 - 在signalrkarma 之间。

    由于某种原因,我有一个 .js,而不是 .ts 业力配置。
    切换到correct configuration后重启VS,问题就解决了。

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

    tsconfig.json 文件中的任何操作都无法解决此问题,因为 TS 的 node 类型和 JS 的 node 类型之间存在冲突。 p>

    【讨论】:

      【解决方案4】:

      在我的例子中,包 electronnode-opcua 使用不同的@types/node 版本,导致“TS4090: (TS) Conflicting “节点”错误的定义。

      正如错误中指出的那样,通过在我的 peerDependencies 中手动提供 @types/node 的版本,我已成功修复了该错误,但是在安装项目之后,该版本发生了变化,结果证明是一个坏主意。所以我在我的 package.json 中添加了 npm dedupe 作为 posinstall 脚本,它工作正常。
      正如the documentation 所说,它浏览整个依赖关系树并通过将重复的包向上移动来删除它们。

      【讨论】:

        【解决方案5】:

        修复了这个问题

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-06
          • 2022-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-16
          • 2021-12-21
          • 2015-04-27
          相关资源
          最近更新 更多