Подтвердить что ты не робот

TypeScript в Visual Studio 2017: включение автоматического определения вызывает ошибки дублирования идентификатора

ОБНОВЛЕНИЕ: У меня есть обходное решение, которое делает работу работоспособной без хаков. Я оставляю свои предыдущие попытки, описанные ниже для потомков. См. Ответ для рабочего решения.


Я только что обновил проект до Visual Studio 2017, и все внезапно получаю всевозможные ошибки TypeScript. Многие из них являются ошибками Duplicate identifier. Когда я дважды щелкните одну из ошибок, откроется файл index.d.ts, расположенный в каталоге, например:

C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types\jquery\index.d.ts

Основываясь на том, что я читал на этой странице:

https://blogs.msdn.microsoft.com/visualstudio/2016/11/28/more-productive-javascript-in-visual-studio-2017-rc/

... похоже, что происходит то, что Visual Studio пытается загружать файлы определений для типов, в которых я уже вручную включил файлы определений. Автоматическое включение файлов определений звучит как отличная функция! Я просто удалю вручную включенные, не так ли? Но я ничего не работаю. Надеюсь, кто-то может сказать мне, где я ошибаюсь.

Для фона, как у меня были вещи, работающие в Visual Studio 2015, было следующее. Я использовал три библиотеки: jQuery, jQuery UI и QUnit. Я просто загрузил файлы .d.ts из DefinitelyTyped и поместил их в свой каталог Scripts в свой проект, и все работало правильно, пока я не открыл проект в VS 2017.

Из сообщений об ошибках кажется, что Visual Studio 2017 приносит свои собственные файлы определений, поэтому я решил, что просто удалю те, которые я привез вручную. Однако, когда я это делаю, теперь я получаю тонны ошибок Cannot find name $, что, по-видимому, означает, что эти файлы определения больше не приводятся по какой-либо причине.

Далее, я подумал, что, возможно, проблема в том, что у меня на самом деле нет исходных файлов JQuery (и других библиотек) в моем проекте. Я просто ссылаюсь на них из Google CDN в своем HTML-источнике. Вышеупомянутая ссылка заставляет звучать так, как Visual Studio ищет фактический свободный файл в качестве индикатора, который он должен вносить в файлы определений. Поэтому я вручную добавил файлы в свой каталог Scripts и перестроил, но ничего не изменилось.

Связанная страница также говорит о том, что вы включаете файлы вашей библиотеки из npm или bower или используете файл tsconfig.json, но прежде чем я спускаюсь по этим дорогам (не часть моего обычного рабочего процесса), я надеюсь, кто-то сможет сказать мне, есть ли предпочтительный способ определения TypeScript в Visual Studio 2017? Спасибо заранее.


ОБНОВЛЕНИЕ: (см. также обновление 2 ниже). Я смог заставить все работать. Это было не совсем интуитивно, поэтому я делюсь своими шагами здесь, надеясь, что: а) он помогает кому-то, и б) кто-то может сказать мне, если я просто делаю это неправильно.

  • Удалить все TypeScript файлы кода и определения из проекта.
  • Откройте файл packages.json и удалите ссылки на файлы определений там.
  • Очистить и построить. Нет ошибок или предупреждений.
  • Через NuGet установите необходимый файл определения (например, для jQuery, вам нужен пакет jquery.TypeScript.DefinitelyTyped).
  • Это установит файл определения в Scripts\typings\jquery.
  • Сделайте то же самое для других библиотек, которые вы указали.
  • Добавьте новый тестовый файл TypeScript и добавьте строку, которая пытается использовать библиотеку, например var foo = $(document);
  • IntelliSense работает! Проект строит! Похоже, мы вернулись в бизнес!
  • Не так быстро. Через несколько секунд мы снова получаем Duplicate idifier errors. Похоже, что Visual Studio сама взяла файлы определения (возможно, активировалась включением файлов определения через NuGet), и теперь у нас снова конфликты.
  • Добавьте файл tsconfig.js со следующей директивой, которая запрещает Visual Studio загружать собственные копии файлов определений: { "compilerOptions": { "types": [] } }
  • Произошли ошибки.
  • Не так быстро! Через несколько секунд появляются сотни новых ошибок, ссылающихся на TypeScript файлы, которые я полностью удалил из своего проекта. Открыв один из файлов, упомянутых в окне ошибки, кажется, что копии были сделаны в <Project>\obj\Debug\... (путь был длиннее, но я забыл его записать).
  • Никакой объем очистки решения не избавится от этих файлов.
  • Удалите весь каталог obj вручную.
  • Добавьте все мои исходные файлы TypeScript в проект.
  • Перестроить. Успех!

ОБНОВЛЕНИЕ 2: Я обнаружил некоторые недостатки с приведенным выше подходом. У меня также есть лучшее решение.

Использование tsconfig.json имеет большой недостаток. Опция перекомпиляции с сохранением не работает в Visual Studio. Я хочу, чтобы мой сайт работал в режиме отладки, внесли некоторые изменения в TypeScript, нажмите "Сохранить", а затем сразу увидите те изменения, которые отражены на сайте.

Я думаю, что одна из вещей, которая вызывала у меня проблемы, заключалась в том, что у меня есть мои файлы TypeScript в папке, отличной от Scripts,, которую я резервирую для файлов, которые должны быть развернуты на сервере как есть. Думаю, Microsoft считает это нестандартным вариантом использования.

После того, как я слишком долго стучал головой о стену, я нашел простое, хотя и взломанное решение. Я взял все подкаталоги в этом каталоге:

C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types

и переместили их в каталог с именем Deleted.

Bam. Более автоматическое включение определений, отсутствие ошибок.

Microsoft, если вы читаете, пожалуйста, предоставьте поддержку моего сценария, который, чтобы повторить:

  • TypeScript файлы, хранящиеся в каталоге, отличном от Scripts
  • Библиотеки (такие как jQuery), включенные через ссылку на сторонний CDN
  • Файлы определения для вышеуказанных библиотек, включенные непосредственно через NuGet.

ОБНОВЛЕНИЕ 3: Я, наконец, начал работать. См. Ответ ниже для не-хакерского решения.

4b9b3361

Ответ 1

Я получил это без хаков. Фокус в том, чтобы использовать файл tsconfig.json и отключить автоматическое определение. В моем первоначальном вопросе я упомянул, что я попробовал это и обнаружил, что не могу использовать compile-on-save. Однако это было связано с тем, что я пытался использовать параметр "смотреть", когда я действительно должен был использовать параметр "compileOnSave".

Вот мой полный набор рабочих шагов для преобразования моего первоначального, разбитого проекта в один, который работает правильно и будет продолжать работать должным образом на немодифицированной установке Visual Studio 2017.

Добавьте файл tsconfig.json к вашему проекту в корневом каталоге.

Настройте свой файл как минимум:

{ "compilerOptions": { "types": [] } }

но, возможно, с другими вариантами, как вам нравится. Мой файл выглядит следующим образом:

{
  "compileOnSave": true,
  "compilerOptions": {
    "types": [],
    "sourceMap": true,
    "target": "es5",
    "noEmitOnError": true
  }
}

Здесь вы можете узнать о других параметрах компилятора: https://www.typescriptlang.org/docs/handbook/compiler-options.html

Это часть "types":[], которая предотвращает автоматическое включение определений.

Это означает, что вам нужно приносить определения для любых библиотек, которые вы используете. К счастью, это супер легко через NuGet. Например, для jQuery просто найдите jquery.TypeScript.DefinitelyTyped и установите соответствующую версию. Это создаст папки под Scripts/typings.

Если у вас ранее были ошибки, вам может потребоваться очистить некоторые трещины. Очистите свой проект, удалите каталог obj в верхней части структуры каталога проекта, и он должен теперь правильно построить. У меня было несколько случайных ошибок, которые ушли, когда я набрал что-то в файле, а затем снова сохранил. Перезапуск Visual Studio может быть и в порядке.

Удачи!


ОБНОВЛЕНИЕ: Я обнаружил, что когда я публикую на Azure, я снова получил ошибки. Однако, когда я добавил директивы, предложенные Perfa ниже в файл tsconfig.json, удалил каталоги bin и obj и перезапустил Visual Studio, эти ошибки больше не появлялись. Я уже несколько раз строил и перестраивал и публиковал в Azure, и они кажутся хорошо и действительно ушли.

Для ясности мой полный файл tsconfig.json теперь выглядит следующим образом:

{
  "compileOnSave": true,
  "compilerOptions": {
    "types": [],
    "sourceMap": true,
    "target": "es5",
    "noEmitOnError": true
  },
  "exclude": [
    "node_modules",
    "obj",
    "bin"
  ]
}

Ответ 2

после установки VS 2017 я получил эту ошибку. Чтобы избавиться от него, я обновил раздел tsconfig.json exclude с obj и bin.

"exclude": [
    "node_modules",
    "obj",
    "bin"
  ]

Ответ 3

У меня была эта точная проблема в старом приложении, которое я обновил до VS 2017, и исправил его, выполнив ответ harley.333 -Modification Install, чтобы включить TypeScript 2.0 SDK.

У меня нет комментариев для комментариев, но чтобы найти его, вам нужно перевернуть вкладку на "Отдельные компоненты", затем она находится в последней группе "SDK, библиотеки и фреймворки".

Установить TypeScript Скриншот SDK