TypeScript: 重复的标识符‘ IteratorResult’

我尝试通过 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"
88335 次浏览

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

"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上的 Typecript 文档,它详细解释了 “ typeRoots”“文件”「包括」/“排除”配置选项。

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

我得到的是错误,在我的角8应用程序,无法解决的问题后,尝试所有的建议,包括在这里接受的答案。我不得不查看以前的角度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
}
}

这个配置之后就没有更多的错误了。 注意: 这并不意味着问题解决了,但至少它让我跳过了导致错误的 bug。由于事实上我的应用程序正在按预期运行,我只是认为这个错误在这一刻无关紧要。

我在谷歌搜索这个错误后发现了这个帖子。我的问题是,不知何故,我有一个不必要的进口,导致这一点:

import { error } from 'protractor';

对我来说,我在父目录项目中有一个 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

默认情况下,所有可见的“@type”包都包含在您的 节点 _ module/@类型的任何封闭文件夹中的包 被认为是可见的; 具体地说,这意味着 ./node _ module/@types/,. ./node _ module/@types/, . ./. ./node _ module/@types/等等。

中的一个接口“ IteratorResult”声明手动解决了这个问题 Node _ module/@types/node/index.d.ts 文件。

我是这样解决的:

npm uninstall --save-dev webpack


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

就像@Muhammad bin Yusrat 在他的评论中说的,运行 npm i @types/node@latest(npm i @types/node不起作用! !)如果你刚刚把角度升级到9。这招对我管用。

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

ionic 5 error after running ionic serve

另一个“迭代器结果”错误是由“扩展类型”错误引起的。参见 类型: 扩展类型只能从对象类型创建。 基本上在你的代码的某个地方你已经使用了像这样的扩展运算符 return { id: doc.payload.id, ...doc.payload.data() };,你必须把它改为这样的 return { id: doc.payload.id, ...doc.payload.data() as {} }; < strong > 即加上 as {}

只需要在你的角度项目的 devDependency 中升级 @types/node:

 npm i --save-dev @types/node

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

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

这解决了问题。 看这里

我只是通过运行

sudo npm remove @types/node

并通过运行以下命令重新安装,它为我工作。

sudo npm i @types/node

这也许能帮到某人。

我在从 v8.2.11或 v9.1.13升级 Angular 时遇到过类似的问题。我能够通过以下步骤解决这个问题

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