Mylący komunikat o błędzie „Typu duplikatu”


224

Dlaczego dostaję to i wiele innych tego rodzaju błędów? Dodaję link do repozytorium oraz fragmenty kodu klucza poniżej. Wydaje mi się, że mam podstawowe niezrozumienie tego, jak działa zależność i „włączanie” łańcuchów.

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'.

Cały kod można znaleźć tutaj .

Mój plik tsconfig.json:

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

Mój 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"
    }
  }
}

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

Twój tsd.d.tsprawdopodobnie wygląda jak kilka odnośników, a nie plik JSON.
yangmillstheory

1
Dlaczego potrzebujesz typings.jsonAND tsd.d.ts?
CodyBugstein,

Odpowiedzi:


126

Wynika to z połączenia dwóch rzeczy:

  • tsconfignie mając żadnej filessekcji. From http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

    Jeśli w pliku tsconfig.json nie ma właściwości „pliki”, kompilator domyślnie dołącza wszystkie pliki do zawierającego go katalogu i podkatalogów. Po określeniu właściwości „pliki” uwzględniane są tylko te pliki.

  • Uwzględnianie typescriptjako zależność npm: node_modules/typescript/Oznacza to, że wszystkie typescriptzostaną uwzględnione ... i tak jest domyślnie uwzględniony lib.d.tsw twoim projekcie ( http://basarat.gitbook.io/typescript/content/docs/types/lib.d.ts .html ) i jego konflikt z tym, który jest dostarczany z wersją maszynopisu w wersji NPM.

Naprawić

Lista filesalbo includejawnie https://basarat.gitbook.io/typescript/docs/project/files.html 🌹


7
Czy zamiast tego zainstaluj globalny skrypt maszynowy?
Ryan Cavanaugh,

2
Tak, nie wiem, dlaczego jest tam lokalnie :) Zakładałem, że może potrzebował trochę API (z perspektywy czasu ... to mało prawdopodobne)
basarat

RyanCavanaugh tak, to był problem; i @basarat, nie jestem jeszcze wyrafinowany, więc był to tylko nadzór, że miałem to zarówno lokalnie, jak i globalnie. Albo w mojej obronie, że robienie tego w rubinowym świecie, z którego pochodzę, nie szkodzi, więc taki był mój kontekst :) Jednak informacje, które dodałeś do swojej odpowiedzi, wciąż uzupełniają obraz dla mnie. Więc dziękuję. obydwoje z was!
pitosalas

5
Użyj excludenieruchomości
basarat

6
Link do Github jest zepsuty
Denny,

70

Aktualizacja : Wersja 1.0 typów zmieniła strukturę wyjściową, a poniższa odpowiedź dotyczy wersji wcześniejszej niż 1.0.

Jeśli używasz Typowania i wykluczasz w tsconfig.json, możesz napotkać problem z duplikatami typów i potrzebujesz czegoś takiego:

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

Aby uprościć integrację z TypeScript, generowane są dwa pliki - typings / main.d.ts i typings / browser.d.ts - które odnoszą się do wszystkich typów zainstalowanych w projekcie, z których tylko jeden może być używany jednocześnie.

Dlatego w zależności od potrzebnej wersji należy wykluczyć (lub dołączyć) pliki typu „przeglądarka” lub „główna”, ale nie oba, ponieważ stąd pochodzą duplikaty.

Ten problem Typings omawia go bardziej.


Świetny człowieku, rozwiązuje to problem z błędem duplikatu identyfikatora wynikającym z uwzględnienia Pisania w projekcie :)
magicode118 10.03.16

dlaczego nie wykluczyć „pisania”? Wpisania dotyczą tylko czasu deweloperskiego, a nie czasu wykonywania?
Eric Hartford,

To określa, gdzie znaleźć typy w czasie kompilacji. Jeśli wykluczysz „pisanie”, nie będziesz już w stanie znaleźć żadnych typów. Problem polega na tym, że próbuje się skompilować i istnieją zduplikowane typy. TypeScript nie jest środowiskiem wykonawczym, transponuje Twój kod do JavaScript.
RationalDev lubi GoFundMonica

2
W VS2017 musiałem wykluczyć „bin”, „obj” w aplikacji .NETCore2 MVC
OSP

W tym przypadku miałem ten sam problem co OSP. Folder obj zawierał pliki TypeScript, więc pokazywały się jako duplikaty. Powodowało to problemy za pierwszym razem, gdy budowałem za każdym razem, a następnie powodowało problemy za każdym razem, gdy budowałem po zmianie typu kompilacji.
Grungondola,

24

Jeśli masz zainstalowane osobno pisma w folderze pism

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

2
ah tak - dodanie pisma do mojego wykluczenia naprawiło mój błąd.
cport1

1
Miałem również kopię w katalogu / obj, co spowodowało błędy pochodzące z „Typescript Virtual Projects”. Dodanie „obj” w celu wykluczenia naprawiło je.
Jon

To całkowicie psuje moją kompilację, ponieważ brakuje typowania.
Spenhouet,

21

Problem został rozwiązany po prostu:

  1. Usuwanie node_modulesfolderu
  2. Uruchamianie, npm installaby uzyskać wszystkie pakiety z poprawnymi wersjami

W moim przypadku problem pojawił się po zmianie gałęzi Git, gdzie nowa gałąź używała innego zestawu modułów węzłów. Stara gałąź używała TypeScript v1.8, nowa wersja 2.0


1
Tak, to zadziałało dla mnie. Na początku nie mogłem usunąć node_modules, ponieważ mówi, że potrzebuje dostępu administratora, aby go usunąć. Moje konto użytkownika ma dostęp administratora; prawdziwym problemem było to, że musiałem zamknąć programy korzystające z tego folderu.
Drew

15

Właśnie natrafiłem na ten problem. Kiedy uruchomiłem npm start, dostałem kilka błędów duplikatu identyfikatora.

ROZWIĄZANIE:

Z folderu głównego projektu uruchom:

rm -r typings
typings install
npm start

i wszystko działa dobrze.


Dla mnie przestawiałem się z używania es6-shimna używanie core-jsdla moich wieloskładników i to jest rozwiązanie, które by zadziałało. Mniej wymagające podejście to stosowanie typings prune.
StriplingWarrior

Pracuje dla mnie. Ale przypuszczam, że powinna być „instalacja npm” zamiast „instalacja typowania”
Ihor Khomiak

Nie mam typingsfolderu :(
Jamie Hutber

12

Możesz również użyć opcji wykluczenia w pliku tsconfig.json, tak jak to:

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

4
Mam dokładnie ten sam problem. Ta poprawka nie działa dla mnie. Używam Typescrip 1.75. Opublikowano problem w repozytorium maszynopisu Github .
Bart

1
Jeśli używasz pisma, a nie TSD, powinieneś skorzystać z rozwiązania zaproponowanego przez @RationalDev
thitemple 22.03.16

4

W moim przypadku dostałem błąd jako

node_modules/@types/es6-promise/index.d.ts (11,15): błąd TS2300: Duplikat identyfikatora „Promise”.

I miałem @types/es6-promisena Package.json, ale mój tsconfigjuż był target: "es6". Sądzę więc, że Promisepodczas kompilacji wystąpił konflikt .

Usunięcie @types/es6-promisez mojego package.jsonpliku rozwiązało problem.


3

Korzystając z webpacka , natknąłem się na ten sam błąd, na wszelki wypadek wykluczenie .d.tspliku w pliku tsconfig.json i node_modules rozwiązało mój problem:

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

Miałem ten błąd również z webpack, po prostu zrestartowałem serwer, naprawiłem go.
Clint,

1

Miałem ten problem spowodowany nieoczekiwanym folderem na dysku (jspm_packages już nieużywanym), który nie był śledzony przez kontrolę źródła (i ukryty przed moim IDE). To miało podwójną instalację TypeScript, co spowodowało problemy.

Trochę przypadkowej sprawy, ale zostawiam tutaj odpowiedź na wypadek, gdyby ktoś szukał tego rozwiązania.


Podobny do mnie. W Visual Studio Code zmieniłem nazwę pliku maszynopisu, co spowodowało, że plik .js jest niewidoczny (osierocony), który nie wyświetlał się już w środowisku IDE, ale mimo to wyświetlał błąd duplikatu identyfikatora.
DAG

0

Miałem ten problem i okazało się, że miałem drugi folder node_modules w moim projekcie, który nie powinien tam być :-(


Istnieje kilka bibliotek, które mają moduły_węzła w swoich folderach. kiedy korzystałem z węzła 4.6.0, nigdy nie stworzyło to żadnego problemu, ale z węzłem 6.9.0 nagle generuje ten błąd.
heman123

Zastanawiam się, od której wersji zaczął się ten problem. Miałem problem z węzłem 5.6.0.
Bruno,

0

Miałem ten błąd, podobnie jak inne, po zmianie tsconfig.json na target: „es2015” i moduł: „es2015”.

Baza ( /// <reference path="../../typings/index.d.ts" />szybki start AngularJS2) używana w pliku main.ts. Aby rozwiązać ten problem, musiałem usunąć tę linię.


0

usunęliśmy folder lib z folderu strony internetowej. zostało to utworzone przez poprzednią instalację typowania. stało się to duplikatem. Po usunięciu działało!


0

Może to być spowodowane pisaniem i zależnością w folderze węzła. więc najpierw sprawdź, co masz w folderze @types, a jeśli masz je w zależnościach, usuń duplikat. dla mnie był to core.js


0

usuń ten @ typy / express-validator z pliku package.json, a następnie uruchom npm install

Czytaj więcej

Komunikat autora: Ten pakiet został uznany za przestarzały To jest definicja typów kodów pośredniczących dla ekspresowego sprawdzania poprawności ( https://github.com/ctavan/express-validator ). express-validator zapewnia własne definicje typów, więc nie trzeba instalować @ types / express-validator!



-2

Wpadłem na podobny problem. Po prostu przeniesienie mojego pliku tsconfig.json z katalogu głównego mojego projektu do innego zakresu pomogło. W moim projekcie przeniosłem tsconfig.json z katalogu głównego na wwwroot.


-2

Całkowite zamknięcie rozwiązania i ponowne uruchomienie projektu rozwiązało mój problem.


Nie wiem, dlaczego zostałeś odrzucony. Po przeczytaniu twojej odpowiedzi kliknąłem „Unieważnij pamięć podręczną i uruchom ponownie” w IntelliJ i problem został rozwiązany, więc dziękuję!
Johannes Stadler
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.