Непонятное сообщение об ошибке «Дубликат идентификатора»


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

Мой цд.джон:

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

Мой цд.д.ц:

{
  "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.
Янгмилл Теория

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», компилятор по умолчанию включает все файлы в каталоге и подкаталогах. Когда указано свойство «files», включаются только эти файлы.

  • Включение typescriptв качестве зависимости npm: node_modules/typescript/Это означает, что все typescriptвключается .... lib.d.tsв любом случае в ваш проект неявно включается ( http://basarat.gitbook.io/typescript/content/docs/types/lib.d.ts .html ) и конфликтует с той, что поставляется с версией машинописи NPM.

Fix

Либо перечислите, filesлибо includeявно https://basarat.gitbook.io/typescript/docs/project/files.html 🌹


7
Или вместо этого установить машинописный текст глобально?
Райан Кавано

2
Да, я не знаю, почему это там локально :) Я предположил, что, возможно, ему нужно немного API от него (в ретроспективе ... это маловероятно)
Басарат

Райан Кавано да, это была проблема; и @basarat, я еще не искушенный, так что это был просто недосмотр, который у меня был как локально, так и глобально. Или в мою защиту, что делать это в рубиновом мире, откуда я родом, не вредит вещам, так что это был мой контекст :) Тем не менее информация, которую вы добавили в свой ответ, продолжает завершать картину для меня. Так что спасибо. вы оба!
питосалась

5
Использование excludeимущества
Басарат

6
Ссылка на Github не работает
Denny

70

Обновление : Версия 1.0 печатных машин изменила структуру вывода, и ответ ниже относится к версии до 1.0.

Если вы используете Typings и исключаете из своего tsconfig.json, вы можете столкнуться с проблемой дублирования типов и вам потребуется что-то вроде следующего:

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

Чтобы упростить интеграцию с TypeScript, создаются два файла - typings / main.d.ts и typings / 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.
StriplingWarrior

Работает для меня. Но предположите, что вместо 'typings install' должно быть 'npm install'
Игорь Хомяк,

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

12

Вы также можете использовать опцию exclude в файле 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 .
Барт

1
Если вы используете наборы, а не TSD, вы должны использовать решение, предложенное @RationalDev
thitemple

4

В моем случае я получил ошибку как

node_modules/@types/es6-promise/index.d.ts (11,15): ошибка TS2300: дубликат идентификатора «Обещание».

И у меня был @types/es6-promiseна package.json, но мой tsconfigуже был с target: "es6". Я думаю, что был конфликт сPromise при компиляции.

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


3

При использовании веб-пакета я столкнулся с той же ошибкой, на всякий случай исключение .d.tsфайла из вашего tsconfig.json и node_modules решило мою проблему:

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

У меня тоже была эта ошибка с webpack, просто перезапустив сервер исправил.
Клинт

1

У меня была эта проблема, вызванная наличием неожиданной папки на диске (jspm_packages больше не используемой), которая не отслеживалась системой контроля версий (и скрывалась от моей IDE). В нем была двойная установка TypeScript, что вызвало проблемы.

Немного странный случай, но оставляю здесь ответ на тот случай, если кто-то другой ищет это решение.


Похож на меня. Я переименовал файл машинописного текста в коде Visual Studio, который вызвал невидимый (потерянный) файл .js, который больше не показывался в IDE, но, тем не менее, выявлял ошибку дублирующего идентификатора.
ДАГ

0

У меня была эта проблема, и оказалось, что у меня была вторая папка node_modules в моем проекте, которая не должна была быть там :-(


Есть несколько библиотек, в которых есть node_modules внутри своих папок. когда я использовал узел 4.6.0, он никогда не создавал никаких проблем, но с узлом 6.9.0 он внезапно выдает эту ошибку.
heman123

Интересно, с какой версии началась эта проблема? У меня была проблема с узлом 5.6.0.
Бруно

0

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

База ( /// <reference path="../../typings/index.d.ts" />быстрый запуск AngularJS2) используется в файле main.ts. Чтобы решить эту проблему, мне пришлось удалить эту строку.


0

мы удалили папку lib из папки сайта. это было создано предыдущей установкой наборов. это стало дубликатом. Когда это было удалено, это сработало!


0

Это может быть связано с тем, что в папке вашего узла есть как типизация, так и зависимость. поэтому сначала проверьте, что у вас есть в папке @types, и, если они есть в зависимостях, удалите дубликат. для меня это был core.js


0

удалите этот @ types / express-validator из файла package.json, затем запустите npm install

Читать далее

Сообщение автора: этот пакет устарел. Это определение типов заглушек для экспресс-валидатора ( https://github.com/ctavan/express-validator ). Экспресс-валидатор предоставляет свои собственные определения типов, поэтому вам не нужно устанавливать @ types / express-validator!



-2

Я столкнулся с аналогичной проблемой. Помогло простое перемещение моего tsconfig.json из корня моего проекта в другую область. В моем проекте я переместил tsconfig.json из корневого каталога в wwwroot.


-2

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


Не знаю, почему ты получил отрицательный голос. Прочитав ваш ответ, я нажал «Invalidate Cache and Restart» в IntelliJ, и проблема была решена, так что спасибо!
Йоханнес Штадлер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.