【问题标题】:TypeScript: Duplicate identifier 'IteratorResult'TypeScript:重复标识符“IteratorResult”
【发布时间】:2019-12-11 09:28:01
【问题描述】:

我正在尝试通过tsc 进行编译——我已经在全球范围内安装了它——我收到了一个错误:

~/AppData/Roaming/nvm/v11.15.0/node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6 - error TS2300: Duplicate identifier 'IteratorResult'.

41 type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
        ~~~~~~~~~~~~~~

  node_modules/@types/node/index.d.ts:170:11
    170 interface IteratorResult<T> { }
                  ~~~~~~~~~~~~~~
    'IteratorResult' was also declared here.

node_modules/@types/node/index.d.ts:170:11 - error TS2300: Duplicate identifier 'IteratorResult'.

170 interface IteratorResult<T> { }
              ~~~~~~~~~~~~~~

~/AppData/Roaming/nvm/v11.15.0/node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6
    41 type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
            ~~~~~~~~~~~~~~
    'IteratorResult' was also declared here.


Found 2 errors.

我已安装 @types/node 版本 10.1.0。 (@latest 有自己的问题...)

tsconfig.json

{
  "compilerOptions": {
    "target": "es2018",
    "moduleResolution": "node",
    "module": "commonjs",
    "jsx": "react",
    "lib": [
      "dom",
      "es2018",
      "dom.iterable",
      "scripthost"
    ],
    "typeRoots": [
      "./node_modules/@types",
      "./types"
    ],
    "types": [],

    "alwaysStrict": true,
    "strictNullChecks": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,

    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "esModuleInterop": true,

    "sourceMap": true,

    "outDir": "dist"
  },
  "files": [
    "app/index.tsx"
  ],
  "include": [
    "app/**/*.ts",
    "app/**/*.tsx",
    "test/**/*.ts",
    "test/**/*.tsx",
    "node_modules/@types/**/*.d.ts",
    "./types/**/*.d.ts"
  ],
  "exclude": [
    "dist"
  ]
}

如果我在全局卸载typescript 并运行npx tsc,它可以工作,但是在全局安装和运行typescript 应该没有问题。毕竟,这就是全局安装的重点。

与此同时,我有一个解决方法,就是给 tsc 取别名(我在 Windows 中使用 git bash)。

alias tsc="path/to/project/node_modules/.bin/tsc.cmd"

【问题讨论】:

  • 当我在全球范围内从 v3.5.3 升级到 v3.6.2 时,我开始出现这个问题......所以猜测那里有一些变化。回滚帮助或在 package.json 中有脚本 "build": "tsc" 并使用 npm run build 帮助,我本地 package.jon 中的 typescript 在 v3.5.3 上,所以 npm 使用它。

标签: typescript types import


【解决方案1】:

在 GitHub - https://github.com/microsoft/TypeScript/issues/32333 上发现了一个相关问题。 @rbuckton 建议升级 @types/node。它对我有用。

【讨论】:

  • npm install --save-dev @types/node
  • npm update --save-dev @types/node 更正确,因为它可能是次要版本升级,请参阅install vs update
  • 在将我的项目升级到 Angular 9 后运行故事书时出现此错误。我假设一个简单的 npm install @types/node 会安装我在 package.json 中已有的类型/节点版本,所以我做了npm install @types/node@latest 并且成功了。
  • 之后出现错误 TS2320:接口 'NodeRequire' 不能同时扩展类型 'Require' 和 'RequireFunction'
  • 必须删除 node_modules 并重新安装它们才能使其正常工作,但这确实是问题所在!
【解决方案2】:

我在我的 Angular 8 应用程序中遇到错误,并且在尝试了此处提出的所有建议(包括接受的答案)后无法解决该问题。我不得不查看以前编译时没有错误的 Angular 6 应用程序,并意识到我可以通过包含来跳过库检查

“skipLibCheck”:真

到 tsconfig.json 文件。鉴于我的应用程序运行良好且没有问题,我决定采用这种方法。这是我的 tsconfig.json 文件的完整配置

{
    "compileOnSave": false,
    "compilerOptions": {
        "baseUrl": "./",
        "outDir": "./dist/out-tsc",
        "sourceMap": true,
        "declaration": false,
        "downlevelIteration": true,
        "experimentalDecorators": true,
        "module": "esnext",
        "moduleResolution": "node",
        "importHelpers": true,
        "target": "es2015",
        "typeRoots": [
            "node_modules/@types"
        ],
        "lib": [
            "es2018",
            "dom"
        ],
        "skipLibCheck": true
    },
    "angularCompilerOptions": {
        "fullTemplateTypeCheck": true,
        "strictInjectionParameters": true
    }
}

此配置后没有更多错误。 注意:这并不意味着问题已经解决,但至少它允许我跳过导致错误的错误。由于我的应用程序按预期运行,我现在只是认为这个错误无关紧要。

【讨论】:

    【解决方案3】:

    我怀疑这是因为您的包含部分:

    "include": [
        "app/**/*.ts",
        "app/**/*.tsx",
        "test/**/*.ts",
        "test/**/*.tsx",
        "node_modules/@types/**/*.d.ts",
        "./types/**/*.d.ts"
      ]
    

    您通常不需要显式包含 *.d.ts 文件。并且可能永远不会声明来自其他库(或节点类型)的文件。

    tsconfig"exclude" 部分默认排除 "node_modules" 下的所有内容(除其他外)。当您添加 "node_modules/@types/**/*.d.ts" 时,您会覆盖该排除,并且 tsc 会尝试包含它们,但这些类型已被声明。

    查看tsconfig.json 上的 Typescript 文档,它解释了 "typeRoots""files""include"/ “排除” 详细配置选项。

    【讨论】:

    • 对我来说,这是 tsconfig.json 中的这一行:"files": [ "./node_modules/@types/node/index.d.ts" ],,这是我从一些教程中获取的。您的回答有帮助!
    【解决方案4】:

    对我来说,原来我在父目录项目中有一个node_modules 文件夹,类似于:

    node_modules
    my-project
    - node_modules
    

    由于node_modules 安装了旧版本的@types/node,因此问题发生了。然而,就我而言,解决方案不是更新@types/node,而是删除那些node_modules,因为我一开始没有使用它们。

    如果您确实需要在具有不同类型的父目录中拥有node_modules,并且这是您想要的,那么您可以专门指定typeRoots

    {
      "compilerOptions": {
        "module": "esnext",
        "target": "es6",
        "declaration": true,
        "outDir": "./dist",
        "typeRoots": ["./node_modules/@types/"]
      },
      "include": [
        "src/**/*"
      ]
    }
    

    这样,就不会扫描父 node_modules 的类型。否则,请在此处阅读:https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types

    默认情况下,所有可见的“@types”包都包含在您的 汇编。任何封闭文件夹的 node_modules/@types 中的包 被认为是可见的;具体来说,这意味着包内 ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/,等等。

    【讨论】:

    • 这家伙守规矩...救了我的一美元
    【解决方案5】:

    正如@Muhammad bin Yusrat 在他的评论中所说,如果您刚刚将 angular 更新为 9,请运行 npm i @types/node@latestnpm i @types/node 不起作用!!)。这对我有用。

    在运行ionic serve-> 'refused to load image 'http:localhost:8100/favicon.ico' 因为它违反了以下内容安全策略.....'后,它还消除了另一个 ionic 5 控制台错误(见下文)。

    另一个“IteratorResult”错误是由“Spread Types”错误引起的。见Typescript: Spread types may only be created from object types。 基本上,在您的代码中的某个地方,您使用了像 return { id: doc.payload.id, ...doc.payload.data() }; 这样的扩展运算符,您必须将其更改为 return { id: doc.payload.id, ...doc.payload.data() as {} }; 即添加 as {}

    【讨论】:

    • 只需从 Angular 8 升级到 9,npm install --save-dev @types/node@latest 修复了“IteratorResult”错误,谢谢!!
    【解决方案6】:

    在 tsconfig.json 中的 compilerOptions 中添加 "skipLibCheck": true

    这解决了这个问题。 Check here

    【讨论】:

      【解决方案7】:

      我刚刚通过运行删除了类型/节点

      sudo npm remove @types/node
      

      并通过运行以下命令再次安装,它对我有用。

      sudo npm i @types/node
      

      【讨论】:

        【解决方案8】:

        只需在 Angular 项目的 devDependencies 中升级 @types/node

         npm i --save-dev @types/node
        

        *** 不要更改 node_modules 中的任何内容 ***

        【讨论】:

          【解决方案9】:

          这可能对某人有所帮助。

          我在从 v8.2.11 或 v9.1.13 升级 Angular 时遇到了类似的问题。我可以按照以下步骤解决问题

          1. 删除node_modules目录和文件package-lock.json
          2. 使用npm install重新安装依赖

          【讨论】:

            【解决方案10】:

            我就是这样解决的:

            npm uninstall --save-dev webpack
            
            npm install --save-dev @angular-devkit/build-angular@latest
            

            【讨论】:

              【解决方案11】:

              我在谷歌搜索错误后找到了这个帖子。我的问题是不知何故我有一个不需要的导入导致这个:

              import { error } from 'protractor';
              

              【讨论】:

                【解决方案12】:

                我通过注释其中一个接口“IteratorResult”声明手动解决了这个问题 node_modules/@types/node/index.d.ts 文件。希望这会有所帮助。

                【讨论】:

                • 此方法有效,直到其他人需要克隆/安装您的存储库
                猜你喜欢
                • 1970-01-01
                • 2020-06-20
                • 1970-01-01
                • 2017-02-19
                • 1970-01-01
                • 1970-01-01
                • 2019-02-18
                • 2016-08-08
                • 1970-01-01
                相关资源
                最近更新 更多