TypeScript:重复的标识符“ IteratorResult”

时间:2019-08-02 18:29:09

标签: typescript

我正在尝试通过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"

11 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分:18)

我在我的angular 8 App中遇到了is错误,尝试了此处提出的所有建议(包括已接受的答案)后无法解决问题。我不得不看一下以前的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
  }
}

此配置后没有其他错误。 注意:这并不意味着问题已解决,但至少它使我可以跳过导致错误的错误。由于我的应用程序按预期运行,因此我现在认为此错误无关紧要。

答案 2 :(得分:4)

我怀疑是因为您的收录部分:

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

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

tsconfig“排除” 部分默认排除"node_modules"下的所有内容(以及其他内容)。当您添加"node_modules/@types/**/*.d.ts"时,您将覆盖该排除项,而tsc尝试将其包括在内,但这些类型已经声明。

检查tsconfig.json上的Typescript文档,它解释了“ typeRoots” “文件” “ include” / < em>“排除” 配置选项的详细信息。

答案 3 :(得分:3)

对我来说,事实证明我在父目录项目中有一个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/,依此类推。

答案 4 :(得分:2)

正如@Muhammad bin Yusrat在他的评论中所说,如果刚刚将angular更新为9,则运行npm i @types/node@latestnpm i @types/node无效!)。

运行ionic serve->'拒绝加载映像'http:localhost:8100 / favicon.ico'后,它也摆脱了另一个ionic 5控制台错误,因为它违反了以下内容安全策略...。 ”(见下文)。

ionic 5 error after running ionic serve

另一个“ 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 {}

答案 5 :(得分:2)

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

这解决了问题。 Check here

答案 6 :(得分:1)

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

sudo npm remove @types/node

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

sudo npm i @types/node

答案 7 :(得分:0)

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

 npm i --save-dev @types/node

***请勿更改node_modules中的任何内容***

答案 8 :(得分:-1)

我在搜索错误后发现了这个线程。我的问题是我以某种方式导致了不必要的导入,从而导致了此问题:

import { error } from 'protractor';

答案 9 :(得分:-1)

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

答案 10 :(得分:-1)

这是我解决的方法:

npm uninstall --save-dev webpack

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