TL;DR: 如何在Visual Studio 2017中包含tsconfig.json文件,并仍然使JavaScript智能感知像默认情况下一样工作,为您自己的代码和第三方库提供代码提示?它是损坏的,还是我只需要更好地理解它的工作原理?
与jQuery类似,我希望在JavaScript和html文件中无处不在地访问自己的JavaScript命名空间并获得智能感知。如何实现这一点?
编辑3:
我在developercommunity.visualstudio.com上报告了这个问题。请考虑给这个问题点赞,以吸引微软更多的关注。
编辑2:
目前的“解决方案”是Resharper,它提供了人们期望的直接开箱即用的功能。但以每年299美元/用户的价格来看,这并不是Visual Studio市场所提供的理想选择。
编辑1:
如果我对Visual Studio中JavaScript智能感知的期望不准确,下面是我期望它运行的一个虚构示例。
假设我在./Scripts文件夹中创建了三个TypeScript文件,我们将称它们为A.ts、B.ts和C.ts。每个文件都包含自己的命名空间:
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;
}
}
此时,人们可以期望能够开始看到新创建的命名空间的智能感知,确实,在A.ts、B.ts和C.ts中,您开始看到这些命名空间的智能感知。很酷。
不幸的是,这并不适用于其他地方,比如/Home/Index.cshtml。Index.cshtml对A、B或C名称空间一无所知。此外,.js文件也不知道这些命名空间,因此需要它们各自的TypeScript声明(.d.ts)文件。
因此,我们将在项目的根目录中添加tsconfig.json文件,并像上面那样进行配置。如果我们编辑其中一个.ts文件并保存它,这会触发我们相应的.d.ts文件编译到./Scripts/out文件夹中。现在,在Index.cshtml和.js文件中是否能获得智能感知?......不行。
现在你可能会认为这些文件需要被包含在项目中,以便Visual Studio可以为智能感知捕捉它们(在创建时被排除)。所以你把它们包含在项目中。智能感知?没有。jQuery智能感知?没有。也许它们需要在要使用它们的文件所在的同一目录中?......有点像?我在很多情况下都遇到了这种智能感知不一致的问题:
我们在C3.js(一个JavaScript文件)中得到了'A'命名空间的智能感知,但其他命名空间却没有。为什么?
也许你认为自己已经走上了正确的轨道,并且在智能感知引擎方面取得了小小的胜利。但是当你重新启动Visual Studio实例时...
等一下....我刚刚在'A'命名空间中使用了智能感知。发生了什么事!?
我不知道。但是经过一番尝试后,我在.js文件顶部放置了一个导入语句,突然间智能感知开始为导入的文件/模块启动。胜利万岁!
即使在Index.cshtml中,我也开始接收我们导入的命名空间的智能感知。
当我关闭带有导入语句的.js文件时,突然之间在Index.cshtml中失去了它们的智能感知。等等...什么??而且与JavaScript文件不同的是,我无法编写导入语句来接收它们的智能感知:或者至少...不使用我的命名空间:
这种不一致的来回反复让我对Visual Studio的JavaScript智能感知究竟是如何工作感到困惑。我仍然不知道它是否有问题,或者我需要更好地理解它。
原帖
系统
Windows 10
VS2017 15.0.0+26228.10
新的JavaScript语言服务已启用
我一直在为使Visual Studio 2017的JavaScript智能感知对我起作用而奋斗了几天,但一无所获。我不知道IDE是否真的有问题,还是我只是没有正确理解它。
我现在对VS2017 JS智能感知如何工作的理解是通过TypeScript定义文件或.d.ts文件。最终,我想让智能感知帮助我们处理自己的TypeScript/JavaScript,但现在我只想让它在一个全新的项目中始终正常工作。
If我创建一个新的ASP.NET MVC 4.5.2项目,开箱即用的JS智能感似乎运行良好,我的意思是我可以在.js文件或<script>标签之间输入美元符号($),然后我可以正确地接收到jQuery的智能感。太棒了。现在,为了实现创建TypeScript文件(.ts)并使TypeScript编译器自动产生我们的.d.ts文件以便我们可以获得我们自己代码的丰富智能感的终极目标,我希望引入一个tsconfig.json文件到项目的根目录中来进行配置。创建tsconfig.json文件后,JS智能感停止工作。我在.js文件或<script>标签之间输入美元符号($)时,我无法获取任何关于jQuery的智能感。这是一个令人沮丧的经历,但是我在上面链接的页面上读到了这个小提示:
注意:如果使用tsconfig.json配置文件,则默认情况下禁用此功能,但可以按照以下说明启用。
"This feature"是指"默认情况下,Salsa语言服务将尝试检测正在使用哪些JavaScript库...以提供更丰富的IntelliSense。"好的,因此,当存在tsconfig.json文件时,除非您明确配置它以如下所述的方式,否则Salsa语言服务将不会自动检测正在使用的库并为其提供intellisense。至少,这就是我的理解。
如果我们向下滚动页面并找到tsconfig文件设置,我们会发现一个名为enableAutoDiscovery的设置,该设置“启用自动检测和下载定义文件,如上所述。”对于“如上所述”的具体内容并没有非常明确的说明,但我只能假设它是指重新启用Salsa的自动检测功能以提供丰富的intellisense的先前提示。因此,我在我的tsconfig.json文件中包括了该选项,但是...没有任何好处;仍然没有JS intellisense。"
事实证明,typingOptions.enableAutoDiscovery已经更名为typeAcquisition.enable。 嗷!好吧,那么我们在tsconfig.json中进行更改,然后......仍然没有JS智能感知。
此时,我可以编写自己的.d.ts文件,Visual Studio的智能感知会很好地捕捉到它(大多数情况下......),但我仍然无法获得第三方库(如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文件以及在%LOCALAPPDATA%\Microsoft\TypeScript\node_modules@types目录中包含的jQuery。 我原本希望所有这些都能到位,我会在我的项目的 .ts 文件和第三方库(至少是那些特定包含的库;目前只有 jQuery)中拥有智能感知。然而...没有。仍然没有 jQuery 智能感知。
顺便说一句,如果我编写了一个针对 jQuery 的导入行,突然间我就得到了 jQuery 智能感知。
...很有趣。也许这是完全合理的;我没有过多地涉及模块导入以及Visual Studio的智能感知如何处理它们,但我真正想要的是在整个应用程序范围内为我们的代码和第三方库提供智能感知。