TL; DR: как включить файл tsconfig.json в Visual Studio 2017 и по-прежнему иметь JavaScript intellisense, работающий как по умолчанию, давая подсказки по коду как для вашего собственного кода, так и для сторонних библиотек? Это не работает, или мне просто нужно лучше понять, как это работает?
Как и jQuery, я хотел бы иметь повсеместный доступ к моим собственным пространствам имен JavaScript через файлы JavaScript и html с помощью intellisense. Как этого добиться?
ИЗМЕНИТЬ 3:
Я сообщил об этой проблеме на developercommunity.visualstudio.com. Пожалуйста, проголосуйте за вопрос, чтобы привлечь больше внимания со стороны Microsoft.
РЕДАКТИРОВАТЬ 2:
В настоящее время «решением» является Resharper, который обеспечивает то, что можно было ожидать прямо из коробки. Но он не совсем идеален по цене 299 долларов в год за пользователя для того, что Visual Studio предлагает сам себе.
РЕДАКТИРОВАТЬ 1:
В случае, если мои ожидания в отношении intellisense JavaScript в Visual Studio неточны, ниже приведен надуманный пример того, как я ожидаю, что он будет работать.
Скажем, я создаю три файла TypeScript в своей папке ./Scripts, мы назовем их A.ts, B.ts и C.ts em. >. Каждый будет содержать свое собственное пространство имен:
A.ts
namespace A {
export function f1(s: string) {
return s;
}
}
B.ts
namespace B {
export function f1(n: number) {
return n;
}
}
C.ts
namespace C {
export function f1(b: boolean) {
return b;
}
}
В этот момент можно ожидать, что вы сможете начать видеть intellisense для своих вновь созданных пространств имен, и действительно, в A.ts, B.ts и C.ts вы начнете видеть intellisense для этих пространств имен. Прохладный.
К сожалению, это не распространяется на другие места, такие как /Home/Index.cshtml. Index.cshtml ничего не знает о пространствах имен A, B или C. Кроме того, файлы .js ничего не знают об этих пространствах имен, поэтому им необходимы соответствующие файлы объявлений TypeScript (.d.ts).
Итак, мы продолжим и добавим наш файл tsconfig.json в корень нашего проекта и настроим его, как мы сделали выше. Если мы редактируем один из наших файлов .ts и сохраняем его, это запускает компиляцию наших соответствующих файлов .d.ts в нашу папку ./Scripts/out. Получаем ли мы теперь intellisense в файлах Index.cshtml и .js? ...Нет.
Теперь вы можете подумать, что эти файлы необходимо включить в проект, чтобы Visual Studio могла использовать их для intellisense (они исключаются при создании). Итак, вы включаете их в проект. Intellisense? Нет. JQuery intellisense? Нет. Возможно, они должны находиться в том же каталоге, что и файл, в котором вы хотите их использовать? .....Вроде? Я сталкивался с такой непоследовательностью intellisense в нескольких случаях:
Каким-то образом мы получаем intellisense для нашего пространства имен «A» в нашем C3.js (примечание: файл JavaScript), но не для других. Какие?
Возможно, вы думаете, что находитесь на правильном пути и одержали небольшую победу над движком intellisense. Но затем вы перезапускаете свой экземпляр Visual Studio и ...
Подождите ... У меня только был intellisense для пространства имен 'A'. Что случилось!?
Я понятия не имею. Но, немного повозившись, я пытаюсь разместить оператор импорта в верхней части файла .js, и внезапно intellisense начинает работать с импортированными файлами / модулями. Ура!
И даже в Index.cshtml я начинаю получать intellisense для наших импортированных пространств имен.
Однако в тот момент, когда я закрываю файл .js с операторами импорта, я внезапно теряю для них intellisense в Index.cshtml. Чего ждать?? И в отличие от файлов JavaScript, я не могу написать оператор импорта для получения для них intellisense:
Или, по крайней мере ... не с моими собственными пространствами имен:
Именно эта непоследовательность взад и вперед сбивает меня с толку относительно того, как на самом деле работает Intellisense JavaScript в Visual Studio. Я до сих пор не знаю, сломан ли он просто или мне нужно лучше понять его.
ОРИГИНАЛЬНАЯ ЗАПИСЬ
Система
Windows 10
VS2017 15.0.0 + 26228.10
Включена новая языковая служба JavaScript
Я боролся за то, чтобы Visual Studio 2017 JavaScript intellisense работал у меня в течение нескольких дней, но безрезультатно. Я не знаю, действительно ли что-то не так с IDE, или я просто не понимаю этого должным образом.
Мое понимание того, как работает Intellisense JS в VS2017, теперь основано на определении машинописного текста. файлы или файлы .d.ts. В конечном итоге я хотел бы, чтобы intellisense помог нам с нашим собственным TypeScript / JavaScript, но прямо сейчас я бы согласился просто на то, чтобы он постоянно работал в новом проекте.
Если я создаю новый проект ASP.NET MVC 4.5.2, встроенный JS intellisense, похоже, будет работать нормально, и под этим я подразумеваю, что могу ввести знак доллара ($) либо в файле .js, либо между ‹script>, и я правильно получаю intellisense для jQuery. Потрясающий. Теперь, имея в виду конечную цель создания файлов TypeScript (.ts) и чтобы компилятор TypeScript автоматически генерировал наши файлы .d.ts, чтобы мы могли получить богатый intellisense для нашего собственного кода, я хочу представить файл tsconfig.json в корень проекта, чтобы настроить его.
После создания файла tsconfig.json JS intellisense перестает работать. Я ввожу знак доллара ($) либо в файл .js, либо между тегами ‹script> и получаю нулевой intellisense для jQuery. Некоторое время это было разочаровывающим опытом, но затем я прочитал эту небольшую заметку, найденную на связанной странице выше:
ПРИМЕЧАНИЕ. Эта функция по умолчанию отключена при использовании файла конфигурации tsconfig.json, но может быть включена, как описано ниже).
«Эта функция» относится к «По умолчанию языковая служба Salsa будет пытаться определить, какие библиотеки JavaScript используются ..., чтобы предоставить более богатый IntelliSense». Хорошо, поэтому языковая служба Salsa не будет автоматически определять используемые библиотеки и предоставлять для них intellisense при наличии файла tsconfig.json, если вы специально не настроите его так, как «описано ниже». По крайней мере, я так понимаю.
Если мы немного прокрутим страницу вниз и перейдем к настройкам файла tsconfig, мы обнаружим настройку для enableAutoDiscovery, которая «включает автоматическое обнаружение и загрузку файлов определений, как описано выше». Это не слишком однозначно относительно того, к чему относится «как описано выше», но я могу только предположить, что это относится к предыдущему примечанию, указывающему на повторное включение функции автоматического обнаружения Salsa для обеспечения богатого интеллекта. Поэтому я включаю эту опцию в свой файл tsconfig.json и ... никакой пользы; все еще нет JS intellisense.
Как оказалось, typingOptions.enableAutoDiscovery был переименован в typeAcquisition .enable. Гррррр. Хорошо, мы вносим это изменение в наш tsconfig.json aaaaaaand ... JS intellisense по-прежнему отсутствует.
На данный момент я я могу написать свои собственные файлы .d.ts, и intellisense Visual Studio подберет их нормально (большую часть времени ...), но у меня все еще нет intellisense для третьего- партийные библиотеки вроде jQuery, что никуда не годится.
Пока что я нашел следующий файл tsconfig.json:
{
"compilerOptions": {
"noEmitOnError": true,
"noImplicitAny": false,
"removeComments": false,
"target": "es5",
"declaration": true,
"declarationDir": "./Scripts/out"
},
"compileOnSave": true,
"typeAcquisition": {
"enable": true,
"include": ["jquery"]
},
"include": [
"./Scripts/app/**/*"
],
"exclude": [
"./Scripts/vendors/**/*",
"./Scripts/out/**/*"
]
}
С помощью виртуального проекта TypeScript я вижу, что файлы .ts моего проекта включены, а также jQuery в мой каталог% LOCALAPPDATA% \ Microsoft \ TypeScript \ node_modules \ @types.
Я надеялся, что со всем этим у меня будет как intellisense для файлов .ts моего собственного проекта, так и сторонние библиотеки (по крайней мере, те, которые специально включены; jQuery только на данный момент). Увы ... нет. По-прежнему нет jQuery intellisense.
Между прочим, если я напишу строку импорта для jQuery, внезапно я получу jQuery intellisense
...интересный. И, может быть, это имеет смысл; Я не очень сильно испортил импорт модулей и то, как intellisense Visual Studio обрабатывает их, но я действительно хочу иметь intellisense для всего приложения как для нашего кода, так и для сторонних библиотек.