Verwirrende Typoskript-Fehlermeldung "doppelte Kennung"


224

Warum bekomme ich diese und viele weitere Fehler dieser Art? Ich füge einen Link zum Repo sowie Schlüsselcode-Schnipsel unten hinzu. Ich glaube, ich habe ein grundlegendes Missverständnis darüber, wie die Verkettung von Abhängigkeit und "Include" funktioniert.

csvproc(master)> tsc
node_modules/typescript/bin/lib.core.d.ts(83,5): error TS2300: Duplicate identifier 'configurable'.
node_modules/typescript/bin/lib.core.d.ts(84,5): error TS2300: Duplicate identifier 'enumerable'.
node_modules/typescript/bin/lib.core.d.ts(85,5): error TS2300: Duplicate identifier 'value'.
node_modules/typescript/bin/lib.core.d.ts(86,5): error TS2300: Duplicate identifier 'writable'.

Den gesamten Code finden Sie hier .

Meine tsconfig.json:

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": false,
        "outDir": "built/",
        "sourceMap": true,
        "target": "es5"
    }
}

Mein tsd.json:

{
  "version": "v4",
  "repo": "borisyankov/DefinitelyTyped",
  "ref": "master",
  "path": "typings",
  "bundle": "typings/tsd.d.ts",
  "installed": {
    "node/node-0.10.d.ts": {
      "commit": "6387999eb899d0ba02d37dd8697647718caca230"
    },
    "should/should.d.ts": {
      "commit": "e1182d56ccb192379eade6055d9ba3fb6a0bacc4"
    }
  }
}

Meine tsd.d.ts:

{
  "version": "v4",
  "repo": "borisyankov/DefinitelyTyped",
  "ref": "master",
  "path": "typings",
  "bundle": "typings/tsd.d.ts",
  "installed": {
    "node/node-0.10.d.ts": {
      "commit": "6387999eb899d0ba02d37dd8697647718caca230"
    },
    "should/should.d.ts": {
      "commit": "e1182d56ccb192379eade6055d9ba3fb6a0bacc4"
    }
  }
}

Ihr tsd.d.tssieht wahrscheinlich aus wie ein paar Referenz-Tags und nicht wie eine JSON-Datei.
Yangmillstheory

1
Warum brauchst du ein typings.jsonUND ein tsd.d.ts?
CodyBugstein

Ich habe die Lösung hier gestellt, wie Sie sehen können. stackoverflow.com/questions/40404353/…
hüseyint

Antworten:


126

Dies liegt an der Kombination von zwei Dingen:

  • tsconfigkeinen filesAbschnitt haben. Von http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

    Wenn in einer tsconfig.json keine Eigenschaft "files" vorhanden ist, schließt der Compiler standardmäßig alle Dateien in das enthaltende Verzeichnis und die Unterverzeichnisse ein. Wenn eine "files" -Eigenschaft angegeben wird, werden nur diese Dateien eingeschlossen.

  • Einschließen typescriptals npm-Abhängigkeit: node_modules/typescript/Dies bedeutet, dass alles typescripteingeschlossen wird. Es ist lib.d.tssowieso implizit in Ihrem Projekt enthalten ( http://basarat.gitbook.io/typescript/content/docs/types/lib.d.ts) .html ) und dessen Konflikt mit demjenigen, der mit der NPM-Version von Typoskript geliefert wird.

Fix

Entweder auflisten filesoder includeexplizit https://basarat.gitbook.io/typescript/docs/project/files.html 🌹


7
Oder stattdessen Typoskript global installieren?
Ryan Cavanaugh

2
Ja, ich weiß nicht, warum es dort vor Ort ist :) Ich nahm an, dass er vielleicht eine API davon brauchte (im Nachhinein ... es ist unwahrscheinlich)
Basarat

RyanCavanaugh ja, das war das Problem; und @basarat, ich bin noch nicht hoch entwickelt, also war es nur ein Versehen, dass ich es sowohl lokal als auch global hatte. Oder zu meiner Verteidigung, dass das in der Rubinwelt, aus der ich komme, nichts schadet, also war das mein Kontext :) Trotzdem vervollständigen die Informationen, die Sie Ihrer Antwort hinzugefügt haben, das Bild für mich. So danke. ihr beide!
Pitosalas

5
Verwenden Sie excludeEigenschaft
Basarat

6
Github Link ist unterbrochen
Denny

70

Aktualisieren : Version 1.0 von Typings hat die Ausgabestruktur geändert und die folgende Antwort bezieht sich auf die Version vor 1.0.

Wenn Sie Typings verwenden und in Ihrer Datei tsconfig.json ausschließen, tritt möglicherweise das Problem doppelter Typen auf und Sie benötigen Folgendes:

{
  "exclude": [
    "typings/browser.d.ts",
    "typings/browser",
    "node_modules"
  ]
}

Um die Integration mit TypeScript zu vereinfachen, werden zwei Dateien generiert - typings / main.d.ts und typings / browser.d.ts -, die auf alle im Projekt installierten Typisierungen verweisen, von denen jeweils nur eine verwendet werden kann.

Je nachdem, welche Version Sie benötigen, sollten Sie die Dateien vom Typ "Browser" oder "Haupt" ausschließen (oder einschließen), jedoch nicht beide, da hier die Duplikate herkommen.

In diesem Typing-Problem wird mehr darüber gesprochen.


Genialer Mann, dies löst das Problem mit dem doppelten Bezeichnerfehler durch das Einfügen von Typisierungen in Ihr Projekt :)
magicode118

warum nicht einfach "tipps" ausschließen? Die Eingaben sind nur für die Entwicklungszeit richtig, nicht für die Laufzeit?
Eric Hartford

Hiermit wird definiert, wo sich die Typen zur Kompilierungszeit befinden. Wenn Sie "Typisierungen" ausschließen, können Sie keine Typen mehr finden. Das Problem hierbei ist, dass versucht wird zu kompilieren und es gibt doppelte Typen. TypeScript ist keine Laufzeit, sondern transpiliert Ihren Code in JavaScript.
RationalDev mag GoFundMonica

2
In VS2017 musste ich "bin", "obj" in der .NETCore2 MVC App ausschließen
OSP

Ich hatte das gleiche Problem wie OSP in diesem Fall. Der obj-Ordner enthielt die TypeScript-Dateien, sodass sie als Duplikate angezeigt wurden. Es verursachte beim ersten Erstellen jedes Mal Probleme und verursachte jedes Mal Probleme, wenn ich den Build-Typ änderte.
Grungondola

24

Wenn Sie die Eingabe separat im Ordner "Eingabe" installiert haben

{
  "exclude": [
    "node_modules",
    "typings"
  ]
}

2
ah ja - das Hinzufügen von Tippungen zu meinem Ausschluss hat meinen Fehler behoben.
cport1

1
Ich hatte auch eine Kopie unter / obj, die Fehler verursachte, die von "Typescript Virtual Projects" kamen. Hinzufügen von "obj", um diese auszuschließen.
Jon

Dies bricht meinen Build vollständig ab, da die Typisierungen fehlen.
Spenhouet

21

Das Problem wurde einfach gelöst durch:

  1. node_modulesOrdner löschen
  2. Wird ausgeführt npm install, um alle Pakete mit den richtigen Versionen abzurufen

In meinem Fall trat das Problem nach dem Ändern von Git-Zweigen auf, bei denen ein neuer Zweig einen anderen Satz von Knotenmodulen verwendete. Der alte Zweig verwendete TypeScript v1.8, der neue v2.0


1
Ja, das hat bei mir funktioniert. Ich konnte node_modules zunächst nicht löschen, da zum Löschen Administratorzugriff erforderlich ist. Mein Benutzerkonto hat Administratorzugriff. Das eigentliche Problem war, dass ich Programme schließen musste, die den Ordner verwendeten.
Drew

15

Ich bin gerade auf dieses Problem gestoßen. Als ich lief npm start, bekam ich eine Reihe von doppelten Identifikationsfehlern.

LÖSUNG:

Führen Sie im Projektstammordner Folgendes aus:

rm -r typings
typings install
npm start

und alles funktioniert gut.


Für mich wechselte ich von Verwendung es6-shimzu Verwendung core-jsfür meine Polyfills, und dies ist die Lösung, die funktioniert hätte. Ein weniger hartnäckiger Ansatz ist zu verwenden typings prune.
StriplingWarrior

Funktioniert bei mir. Aber denke, es sollte "npm install" anstelle von "typings install" geben
Ihor Khomiak

Ich habe keinen typingsOrdner :(
Jamie Hutber

12

Sie können auch die Ausschlussoption in der Datei tsconfig.json wie folgt verwenden:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "declaration": false,
    "noImplicitAny": false,
    "removeComments": true,
    "noLib": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },
  "exclude": [
    "node_modules"
  ]
}

4
Ich habe genau das gleiche Problem. Dieser Fix funktioniert bei mir nicht. Ich benutze Typescrip 1.75. Ich habe ein Problem im Typescript Github Repo gepostet .
Bart

1
Wenn Sie Typisierungen und nicht TSD verwenden, sollten Sie die von @RationalDev vorgeschlagene Lösung verwenden
thitemple

4

In meinem Fall habe ich den Fehler als bekommen

node_modules/@types/es6-promise/index.d.ts (11,15): Fehler TS2300: Doppelte Kennung 'Promise'.

Und ich hatte @types/es6-promiseauf meinem package.json aber mein tsconfigwar schon bei target: "es6". Ich denke, es gab einen Konflikt Promisebeim Kompilieren.

Das Entfernen @types/es6-promiseaus meiner package.jsonDatei hat das Problem behoben.


3

Bei der Verwendung von Webpack ist derselbe Fehler aufgetreten , nur für den Fall, dass das Ausschließen der .d.tsDatei in Ihrer Datei tsconfig.json und node_modules mein Problem behoben hat:

"exclude": [
    "node_modules",
    "typings/main",
    "typings/main.d.ts",
    "typings/index.d.ts"
] 

Ich hatte diesen Fehler auch mit Webpack, nur ein Neustart des Servers hat ihn behoben.
Clint

1

Ich hatte dieses Problem durch einen unerwarteten Ordner auf der Festplatte (jspm_packages nicht mehr verwendet wird), der nicht von der Quellcodeverwaltung verfolgt wurde (und vor meiner IDE verborgen war). Dies hatte eine doppelte Installation von TypeScript, die die Probleme verursachte.

Ein bisschen wie ein Randfall, aber hier eine Antwort hinterlassen, nur für den Fall, dass jemand anderes nach dieser Lösung sucht.


Ähnlich wie ich. Ich habe eine Typoskriptdatei in Visual Studio Code umbenannt, was zu einer unsichtbaren (verwaisten) .js-Datei führte, die nicht mehr in der IDE angezeigt wurde, aber dennoch den doppelten Bezeichnerfehler aufwies.
DAG

0

Ich hatte dieses Problem und es stellte sich heraus, dass ich einen zweiten node_modules-Ordner in meinem Projekt hatte, der eigentlich nicht vorhanden sein sollte :-(


Es gibt einige Bibliotheken, deren Ordner node_modules enthalten. Als ich Knoten 4.6.0 benutzte, verursachte es nie ein Problem, aber mit Knoten 6.9.0 wird dieser Fehler plötzlich ausgelöst.
heman123

Ich frage mich, mit welcher Version dieses Problem begonnen hat. Ich hatte das Problem mit Knoten 5.6.0.
Bruno

0

Ich hatte diesen Fehler zusammen mit anderen, nachdem ich meine tsconfig.json in target: "es2015" und module: "es2015" geändert hatte.

Die Basis (AngularJS2-Schnellstart), die /// <reference path="../../typings/index.d.ts" />in der Datei main.ts verwendet wird. Um dies zu lösen, musste ich diese Zeile entfernen.


0

Wir haben einen lib-Ordner aus dem Website-Ordner entfernt. Dies wurde durch eine vorherige Installation von Typisierungen erstellt. dies wurde doppelt. Als dies entfernt wurde, hat es funktioniert!


0

Dies kann daran liegen, dass in Ihrem Knotenordner sowohl Eingabe als auch Abhängigkeit vorhanden sind. Überprüfen Sie also zuerst, was sich in Ihrem Ordner @types befindet, und entfernen Sie das Duplikat, wenn Sie sie in Abhängigkeiten haben. für mich war es core.js


0

Entfernen Sie diesen @ types / express-validator aus der Datei package.json und führen Sie dann npm install aus

Weiterlesen

Autorennachricht: Dieses Paket ist veraltet. Dies ist eine Definition der Stub-Typen für Express-Validator ( https://github.com/ctavan/express-validator ). Express-Validator bietet eigene Typdefinitionen, sodass @ types / Express-Validator nicht installiert sein muss!


0

Führen Sie den folgenden Befehl aus, um dieses Problem zu beheben.

npm install @types/node --save-dev


-2

Ich bin auf ein ähnliches Problem gestoßen. Es hat geholfen, meine Datei tsconfig.json einfach vom Stammverzeichnis meines Projekts in einen anderen Bereich zu verschieben. In meinem Projekt habe ich tsconfig.json vom Stamm nach wwwroot verschoben.


-2

Das vollständige Schließen der Lösung und das erneute Ausführen des Projekts lösten mein Problem.


Ich weiß nicht, warum du herabgestimmt wurdest. Nachdem ich Ihre Antwort gelesen hatte, klickte ich in IntelliJ auf "Caches ungültig machen und neu starten" und das Problem wurde behoben. Vielen Dank!
Johannes Stadler
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.