ОБНОВЛЕНИЕ: У меня есть обходное решение, которое делает работу работоспособной без хаков. Я оставляю свои предыдущие попытки, описанные ниже для потомков. См. Ответ для рабочего решения.
Я только что обновил проект до Visual Studio 2017, и все внезапно получаю всевозможные ошибки TypeScript. Многие из них являются ошибками Duplicate identifier
. Когда я дважды щелкните одну из ошибок, откроется файл index.d.ts, расположенный в каталоге, например:
C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types\jquery\index.d.ts
Основываясь на том, что я читал на этой странице:
... похоже, что происходит то, что 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: Я, наконец, начал работать. См. Ответ ниже для не-хакерского решения.