Помилкове повідомлення про помилку "дублікат ідентифікатора"


224

Чому я отримую цю та ще багато подібних помилок? Я додаю посилання на репо, а також ключові фрагменти коду нижче. Я думаю, що у мене є основне нерозуміння того, як працює залежність і "включати" ланцюги.

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

Весь код можна знайти тут .

Мій tsconfig.json:

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

Мій 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"
    }
  }
}

Мій 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"
    }
  }
}

Ви , tsd.d.tsймовірно , виглядає як пара опорних тегів, а не файл JSON.
— yangmillstheory

1
Для чого вам потрібен typings.jsonІ tsd.d.ts?
— CodyBugstein

Я кладу рішення тут, ви можете бачити. stackoverflow.com/questions/40404353 / ...
— hüseyint

Відповіді:


126

Це відбувається через поєднання двох речей:

  • tsconfigне маючи жодного filesрозділу. Від http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

    Якщо в tsconfig.json немає властивості "файлів", компілятор за замовчуванням включає всі файли, що містять каталог та підкаталоги. Коли вказано властивість "files", включаються лише ті файли.

  • Включення typescriptяк залежність від npm: node_modules/typescript/Це означає, що все typescriptвключено .... все одно неявно включено lib.d.tsу ваш проект ( http://basarat.gitbook.io/typescript/content/docs/types/lib.d.ts .html ) та його суперечливість з тією, що постачається з версією NPM typecript.

Виправити

Список filesабо includeявно https://basarat.gitbook.io/typescript/docs/project/files.html 🌹


7
Або замість цього встановити машинопис у всьому світі?
— Райан Кавано

2
Так, я не знаю, чому це там локально :) Я припускав, що, можливо, йому потрібні певні api від нього (заднім числом ... це малоймовірно)
— basarat

RyanCavanaugh так, це була проблема; і @basarat, я ще не складний, тому це був просто нагляд, що я мав це як на місцевому, так і на глобальному рівні. Або на мій захист, що робити це в світі рубінів, звідки я родом, не шкодить речам, так це був мій контекст :) І все-таки інформація, яку ви додали до своєї відповіді, продовжує доповнювати картину для мене. Тож спасибі ви обоє!
— pitosalas

5
Використовуйте excludeмайно
— базар

6
Посилання Github розірвано
— Denny

70

Оновлення : Версія 1.0 Типових змін змінила структуру виводу, і наведена нижче відповідь стосується попередньої версії 1.0.

Якщо ви використовуєте Типірування та виключаєте у своєму tsconfig.json, ви можете зіткнутися з випуском дублікатів типів і вам потрібно щось подібне:

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

Для спрощення інтеграції з TypeScript створюються два файли - типізація / main.d.ts та типізація / browser.d.ts, які посилаються на всі типізації, встановлені в проекті, лише один з яких можна одночасно використовувати.

Отже, залежно від необхідної версії, ви повинні виключити (або включити) файли типу «браузер» або «основний», але не обидва, оскільки саме звідси беруться дублікати.

У цьому типовому питанні детальніше йдеться про це.


Чудовий чоловік, це вирішує проблему з помилкою дублювання ідентифікатора, включаючи Типінг у ваш проект :)
— magicode118

чому б просто не виключити "типізацію"? Типінги призначені лише для розробленого часу, а не для запуску?
— Ерік Хартфорд

Це визначає, де знайти типи під час компіляції. Якщо виключити "типізацію", ви більше не можете знайти жодного типу. Тут проблема полягає в тому, що вона намагається компілювати і є дублікати типів. TypeScript - це не час виконання, він перетворює ваш код у JavaScript.
— RationalDev любить GoFundMonica

2
У VS2017 мені довелося виключити "bin", "obj" у додатку .NETCore2 MVC
— OSP

У мене був той самий випуск, що і OSP на цьому. У папці obj були файли TypeScript, тому вони відображалися як дублікати. Це спричинило проблеми вперше, коли я будував щоразу, а потім постійно створював проблеми щоразу, коли я будував, коли я змінював тип збірки.
— Грунгондола

24

Якщо ви встановили типізації окремо в папці типізації

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

2
ах так - додавання типізації до мого виключення виправляло помилку.
— cport1

1
У мене також була копія під / obj, що спричинило помилки, що надходять із "Typescript Virtual Projects". Додавання "obj" для виключення виправлених.
— Джон

Це повністю розбиває мою складку, коли типінгу не вистачає.
— Spenhouet

21

Проблема була вирішена просто:

  1. Видалення node_modulesпапки
  2. Запуск, npm installщоб отримати всі пакунки з правильними версіями

У моєму випадку проблема виникла після зміни гілок Git, де нова гілка використовувала інший набір модулів вузлів. Стара гілка використовувала TypeScript v1.8, нова - v2.0


1
Так, це працювало для мене. Спочатку я не зміг видалити node_modules, оскільки він говорить, що для видалення потрібен доступ адміністратора. Мій обліковий запис користувача має доступ адміністратора; справжньою проблемою було те, що мені потрібно було закрити програми, які використовували папку.
— Дрю

15

Я просто зіткнувся з цією проблемою. Коли я побіг npm start, у мене з'явилася купа помилок дублікату ідентифікатора.

РІШЕННЯ:

З кореневої папки проекту запустіть:

rm -r typings
typings install
npm start

і все працює добре.


Для мене я перейшов з використання es6-shimна використання core-jsдля моїх поліфілів, і це рішення, яке спрацювало б. Менш важким є підхід typings prune.
— Стриптинг-воїн

Працює для мене. Але здогадуйтесь, що замість "типінгувати" слід "npm install"
— Ігор Хом'як

У мене немає typingsпапки :(
— Джеймі Хатбер

12

Ви також можете використати опцію виключення у файлі tsconfig.json так:

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

4
Я маю це саме таке питання. Це виправлення не працює для мене. Я використовую Typescrip 1,75. Я опублікував випуск у Typescript Github repo .
— Барт

1
Якщо ви використовуєте типізацію, а не TSD, вам слід скористатися рішенням, запропонованим @RationalDev
— thitemple

4

У моєму випадку я отримав помилку як

node_modules/@types/es6-promise/index.d.ts (11,15): помилка TS2300: Дублікат ідентифікатора 'Обіцяти'.

І я мав @types/es6-promiseу своєму пакеті.json, але мійtsconfig уже був target: "es6". Тож я припускаю, що Promiseпри складанні конфлікту було конфлікт .

Видалення @types/es6-promiseз мого package.jsonфайлу вирішило проблему.


3

Використовуючи webpack, я натрапив на таку ж помилку, на всякий випадок виключення .d.tsфайлу у ваших tsconfig.json та node_modules вирішив мою проблему:

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

У мене також була помилка з вебпакетом, просто перезапуск сервера виправив.
— Клінт

1

У мене ця проблема була викликана тим, що на диску з'явилася несподівана папка (jspm_packages більше не використовується), яку не відслідковувало управління джерелом (і приховано від моєї IDE). У ньому було встановлено повторне встановлення TypeScript, що спричинило проблеми.

Трохи крайній випадок, але тут залишається відповідь на випадок, якщо хтось інший полює на це рішення.


Схожий на мене. Я перейменував файл типу машинопису у Visual Studio Code, що спричинило невидимий (осиротілий) .js файл, який більше не відображався в IDE, але все ж показував помилку дублюючого ідентифікатора.
— DAG

0

У мене була ця проблема, і, виявляється, у мене в проекті була друга папка node_modules, яка не мала бути там :-(


Є деякі бібліотеки, які мають node_modules всередині своїх папок. коли я використовував вузол 4.6.0, він ніколи не створював жодних проблем, але з вузлом 6.9.0 він раптом кидає цю помилку.
— heman123

Цікаво, з якої версії розпочався цей випуск У мене виникла проблема з вузлом 5.6.0.
— Бруно

0

У мене була помилка разом з іншими, коли я змінив свій tsconfig.json на target: "es2015" та модуль: "es2015".

База ( /// <reference path="../../typings/index.d.ts" />швидкий старт AngularJS2), що використовується у файлі main.ts. Щоб вирішити це, мені довелося видалити цю лінію.


0

ми видалили папку lib із папки веб-сайту. це було створено попередньою установкою типінгу. це стало дублюватим. Коли це було знято, воно працювало!


0

Це може бути через те, що у вашій папці вузла є як введення, так і залежність. тому спочатку перевірте, що у вас в папці @types, і якщо вони є у залежностях, видаліть дублікат. для мене це було core.js


0

видаліть цей @ type / express-validator з файлу package.json, а потім запустіть npm install

Детальніше

Повідомлення автора: Цей пакет застарілий. Це визначення типів заглушки для експрес-валідатора ( https://github.com/ctavan/express-validator ). express-validator надає власні визначення типів, тому вам не потрібно встановлювати @ type / express-validator!



-2

Я зіткнувся з подібною проблемою. Просто переміщення мого tsconfig.json з кореня мого проекту до іншого масштабу допомогло. У своєму проекті я перемістив tsconfig.json від кореня до wwwroot.


-2

Повне закриття рішення та відновлення проекту вирішили мою проблему.


Не знаю, навіщо тебе зняли. Прочитавши вашу відповідь, я натиснув "Недійсні кеші та перезапуск" в IntelliJ і проблема була вирішена, тож дякую!
— Йоганнес Стадлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.