TypeScript: Doppelte Kennung 'IteratorResult'


99

Ich versuche zu kompilieren über - tscwas ich global installiert habe - und erhalte eine Fehlermeldung:

~/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.

Ich habe @types/nodeVersion 10.1.0 installiert. ( @latesthat seine eigenen Probleme ...)

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"
  ]
}

Wenn ich typescriptglobal deinstalliere und ausführe npx tsc, funktioniert es, aber es sollte nichts Falsches daran sein, typescriptglobal zu installieren und auszuführen . Schließlich ist das der springende Punkt bei der globalen Installation.

In der Zwischenzeit habe ich eine Problemumgehung, die nur Alias ​​tsc ist (ich verwende Git Bash in Windows).

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

Dieses Problem tauchte für mich auf, als ich ein globales Upgrade von v3.5.3 auf v3.6.2 durchführte. Ich vermute also, dass sich dort etwas geändert hat. Rollback half oder Skript "build": "tsc" in package.json und die Verwendung von npm run build half, wobei Typoskript in meiner lokalen package.jon auf v3.5.3 war, also verwendet npm das.
— Anant Anand Gupta

Antworten:


142

Auf GitHub wurde ein Problem gefunden - https://github.com/microsoft/TypeScript/issues/32333, das verwandt war. @rbuckton schlug ein Upgrade vor @types/node. Es hat bei mir funktioniert.


29
npm install --save-dev @types/node
— Coverboy

17
npm update --save-dev @types/nodeist korrekter, da es sich möglicherweise um ein geringfügiges Versions-Upgrade handelt, siehe Installation gegen Update
— Taran

12
Ich habe diesen Fehler beim Ausführen von Storybook erhalten, nachdem ich mein Projekt auf Angular 9 aktualisiert habe. Ich nahm an, dass ein einfacher npm install @types/nodedie Version der Typen / Knoten installieren würde, die ich bereits in meiner package.json habe, also habe ich es getan npm install @types/node@latestund es hat funktioniert.
— Muhammad bin Yusrat

Danach habe ich den Fehler TS2320 erhalten: Die Schnittstelle 'NodeRequire' kann die Typen 'Require' und 'RequireFunction' nicht gleichzeitig erweitern
— Travnikov.dev

13

Ich habe den Fehler is in meiner Angular 8-App erhalten und konnte das Problem nicht beheben, nachdem ich alle hier gemachten Vorschläge einschließlich der akzeptierten Antwort ausprobiert hatte. Ich musste mir eine frühere Angular 6-App ansehen, die fehlerfrei kompiliert wurde, und erkannte, dass ich die Bibliotheksprüfung einfach durch Einschließen überspringen konnte

"skipLibCheck": true

in die Datei tsconfig.json. Da meine App problemlos funktioniert, habe ich mich für diesen Ansatz entschieden. Hier ist die vollständige Konfiguration meiner Datei 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
  }
}

Nach dieser Konfiguration gab es keine Fehler mehr. Hinweis: Das bedeutet nicht, dass das Problem behoben ist, aber es hat mir zumindest ermöglicht, den Fehler zu überspringen, der den Fehler verursacht hat. Aufgrund der Tatsache, dass meine App wie erwartet ausgeführt wird, hielt ich diesen Fehler derzeit für irrelevant.


8

Ich vermute, es liegt daran, dass Ihr Include-Bereich:

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

Normalerweise müssen Sie * .d.ts-Dateien nicht explizit einschließen. Und wahrscheinlich niemals Deklarationsdateien aus anderen Bibliotheken (oder Knotentypen).

tsconfigDer Abschnitt "Ausschließen" schließt "node_modules"(unter anderem) standardmäßig alles aus . Wenn Sie hinzufügen "node_modules/@types/**/*.d.ts", überschreiben Sie diesen Ausschluss und tsc versucht, sie einzuschließen, aber diese Typen sind bereits deklariert.

Überprüfen Sie die Typescript-Dokumente in tsconfig.json. Dort werden die Konfigurationsoptionen "typeRoots" , "files" und "include" / "exclude" ausführlich erläutert.


1
Für mich war es diese Zeile in tsconfig.json, "files": [ "./node_modules/@types/node/index.d.ts" ],die ich einem Tutorial entnommen habe. Ihre Antwort hat geholfen!
— Caffeinum

2

Für mich stellte sich heraus, dass ich einen node_modulesOrdner in einem übergeordneten Verzeichnisprojekt hatte, ähnlich wie dieser:

node_modules
my-project
- node_modules

Da die node_moduleseine ältere Version von @types/nodeinstalliert hatte, trat das Problem auf. In meinem Fall bestand die Lösung jedoch nicht darin, diese zu aktualisieren, @types/nodesondern zu entfernen, node_modulesda ich sie überhaupt nicht verwendet habe.

Wenn Sie tatsächlich node_modulesein Verzeichnis in einem übergeordneten Verzeichnis mit verschiedenen Typen benötigen und dies so sein soll, können Sie Folgendes angeben typeRoots:

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

Auf diese Weise werden die übergeordneten node_modulesElemente nicht nach Typen durchsucht. Andernfalls lesen Sie hier: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types

Standardmäßig sind alle sichtbaren "@types" -Pakete in Ihrer Zusammenstellung enthalten. Pakete in den Typen node_modules / @ eines umschließenden Ordners werden als sichtbar betrachtet. Dies bedeutet insbesondere Pakete innerhalb von ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ usw.


1

Wie @Muhammad bin Yusrat in seinem Kommentar sagte, renne npm i @types/node@latest( npm i @types/nodefunktioniert nicht !!), wenn du gerade den Winkel auf 9 aktualisiert hast. Das hat bei mir funktioniert.

Es wurde auch ein weiterer Fehler der ionic 5-Konsole nach dem Ausführen beseitigt ionic serve-> 'Das Laden des Bildes wurde abgelehnt' http: localhost: 8100 / favicon.ico ', da es gegen die folgende Inhaltssicherheitsrichtlinie verstößt .....' (siehe unten).

ionic 5 Fehler nach dem Ausführen von ionic serve

Ein weiterer 'IteratorResult'-Fehler wurde durch den Fehler "Spread Types" verursacht. Siehe Typoskript: Spread-Typen dürfen nur aus Objekttypen erstellt werden . Grundsätzlich haben Sie irgendwo in Ihrem Code einen Spread-Operator wie diesen verwendet return { id: doc.payload.id, ...doc.payload.data() };und müssen ihn in diesen ändern, return { id: doc.payload.id, ...doc.payload.data() as {} }; dh hinzufügenas {}


Einfach von Angular 8 auf 9 upgraden, npm install --save-dev @types/node@latestden "IteratorResult" -Fehler behoben, danke !!
— Nier

0

Aktualisieren @types/nodeSie einfach die devDependencies Ihres Angular-Projekts:

 npm i --save-dev @types/node

*** Ändere nichts in node_modules***



-1

Ich habe diesen Thread gefunden, nachdem ich den Fehler gegoogelt habe. Mein Problem war, dass ich irgendwie einen nicht benötigten Import hatte, der dies verursachte:

import { error } from 'protractor';

-1

Ich habe dieses Problem manuell behoben, indem ich eine der Schnittstellendeklarationen "IteratorResult" in der Datei "node_modules/@types/node/index.d.ts" kommentiert habe. Hoffe das wird helfen.


2
Dies funktioniert so lange, bis jemand anderes Ihr Repo klonen / installieren muss
— dx_over_dt

-1

So habe ich es gelöst:

npm uninstall --save-dev webpack

npm install --save-dev @angular-devkit/build-angular@latest
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.