TypeScript: Duplicate identifier 'IteratorResult'
TypescriptTypesImportTypescript Problem Overview
I'm trying to compile via tsc
--which I've installed globally--and I'm getting an error:
~/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.
I have @types/node
version 10.1.0 installed. (@latest
has its own issues...)
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"
]
}
If I uninstall typescript
globally and run npx tsc
it works, but there should be nothing wrong with installing and running typescript
globally. After all, that's the whole point of installing things globally.
In the meantime I have a workaround which is to just alias tsc (I'm using git bash in Windows).
alias tsc="path/to/project/node_modules/.bin/tsc.cmd"
Typescript Solutions
Solution 1 - Typescript
Found an issue on GitHub - https://github.com/microsoft/TypeScript/issues/32333 which was related. @rbuckton suggested upgrading @types/node
. It worked for me.
Solution 2 - Typescript
I was getting the is error in my angular 8 App and couldn't resolve the issue after trying all suggestions made here including the accepted answer. I had to look at a previous angular 6 App that compiled without errors and realised that I could just skip the library check by including
> "skipLibCheck": true
to the tsconfig.json file. With the fact that my App is running well without problems, I decided to take this approach. Here is the complete configuartion of my tsconfig.json file
{
"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
}
}
There were no more errors after this configuration. Note: That doesn't mean that the problem is solved but at least it allowed me to skip the bug that was causing the error. Due to the fact that my App is running as expected I just considered this error irrelevant at this moment.
Solution 3 - Typescript
I suspect it is because your include section:
"include": [
"app/**/*.ts",
"app/**/*.tsx",
"test/**/*.ts",
"test/**/*.tsx",
"node_modules/@types/**/*.d.ts",
"./types/**/*.d.ts"
]
You usually don't need to explicitly include *.d.ts files. And probably never declaration files from other libraries (or node types).
tsconfig
's "exclude" section excludes everything under "node_modules"
by default (among other things). When you add "node_modules/@types/**/*.d.ts"
you override that exclude and tsc tries to include them, but those types are already declared.
Check Typescript docs on tsconfig.json, it explains the "typeRoots", "files" and "include"/"exclude" config options in detail.
Solution 4 - Typescript
For me it turned out I had a node_modules
folder in a parent directory project, something similar to this:
node_modules
my-project
- node_modules
Since the node_modules
had an older version of @types/node
installed, the problem happened. In my case the solution however wasn't to update @types/node
but instead to remove those node_modules
since I wasn't using them in the first place.
If you actually need to have a node_modules
in a parent directory with different types and this is how you want it to be, then you can specify the typeRoots
specifically:
{
"compilerOptions": {
"module": "esnext",
"target": "es6",
"declaration": true,
"outDir": "./dist",
"typeRoots": ["./node_modules/@types/"]
},
"include": [
"src/**/*"
]
}
That way, the parent node_modules
aren't scanned for types. Otherwise they are, read here: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types
> By default all visible “@types” packages are included in your > compilation. Packages in node_modules/@types of any enclosing folder > are considered visible; specifically, that means packages within > ./node_modules/@types/, ../node_modules/@types/, > ../../node_modules/@types/, and so on.
Solution 5 - Typescript
As @Muhammad bin Yusrat said in his comment, run npm i @types/node@latest
(npm i @types/node
doesn't work !!) if you have just updated angular to 9. That worked for me.
It also got rid of another ionic 5 console error after running ionic serve
-> 'refused to load image 'http:localhost:8100/favicon.ico' because it violates the following Content Security Policy .....' (see below).
Another 'IteratorResult' error was caused by "Spread Types" Error. See https://stackoverflow.com/questions/51189388/typescript-spread-types-may-only-be-created-from-object-types/51193091.
Basically somewhere in your code you have used a spread operator like this return { id: doc.payload.id, ...doc.payload.data() };
and you have to change it to this return { id: doc.payload.id, ...doc.payload.data() as {} };
ie add as {}
Solution 6 - Typescript
Add skipLibCheck: true
in compilerOptions
in tsconfig.json.
This solved the issue. Check here
Solution 7 - Typescript
I just removed types/node by running
sudo npm remove @types/node
and installed again by running the following command and it worked for me.
sudo npm i @types/node
Solution 8 - Typescript
Just upgrade @types/node
in devDependencies of your Angular project:
npm i --save-dev @types/node
*** Do not change anything in node_modules
***
Solution 9 - Typescript
This might help someone.
I had a similar issue upgrading Angular from v8.2.11 or v9.1.13. I was able to resolve the issue by following the steps
- Remove the
node_modules
directory and filepackage-lock.json
- Reinstall the dependencies using
npm install
Solution 10 - Typescript
This is how I solved it:
npm uninstall --save-dev webpack
npm install --save-dev @angular-devkit/build-angular@latest
Solution 11 - Typescript
I found this thread after googling the error. My problem was that somehow I had an unneeded import which caused this:
import { error } from 'protractor';
Solution 12 - Typescript
I resolved this issue manually by commenting one of the interface "IteratorResult" declaration in node_modules/@types/node/index.d.ts file. Hope this will help.