Visual Studio 2017,JavaScript智能感知不一致性

37

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.tsB.tsC.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中,您开始看到这些命名空间的智能感知。很酷。

enter image description here

不幸的是,这并不适用于其他地方,比如/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智能感知?没有。也许它们需要在要使用它们的文件所在的同一目录中?......有点像?我在很多情况下都遇到了这种智能感知不一致的问题:

enter image description here

我们在C3.js(一个JavaScript文件)中得到了'A'命名空间的智能感知,但其他命名空间却没有。为什么?

也许你认为自己已经走上了正确的轨道,并且在智能感知引擎方面取得了小小的胜利。但是当你重新启动Visual Studio实例时...

enter image description here

等一下....我刚刚在'A'命名空间中使用了智能感知。发生了什么事!?

我不知道。但是经过一番尝试后,我在.js文件顶部放置了一个导入语句,突然间智能感知开始为导入的文件/模块启动。胜利万岁!

enter image description here

即使在Index.cshtml中,我也开始接收我们导入的命名空间的智能感知。

enter image description here

当我关闭带有导入语句的.js文件时,突然之间在Index.cshtml中失去了它们的智能感知。等等...什么??而且与JavaScript文件不同的是,我无法编写导入语句来接收它们的智能感知:

enter image description here

或者至少...不使用我的命名空间:

enter image description here

这种不一致的来回反复让我对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。

TypeScript Virtual Project

我原本希望所有这些都能到位,我会在我的项目的 .ts 文件和第三方库(至少是那些特定包含的库;目前只有 jQuery)中拥有智能感知。然而...没有。仍然没有 jQuery 智能感知。
顺便说一句,如果我编写了一个针对 jQuery 的导入行,突然间我就得到了 jQuery 智能感知。

enter image description here

...很有趣。也许这是完全合理的;我没有过多地涉及模块导入以及Visual Studio的智能感知如何处理它们,但我真正想要的是在整个应用程序范围内为我们的代码和第三方库提供智能感知。


我一直遇到同样的问题。我的命名空间有一段时间都有智能感知。突然间,我失去了所有的智能感知。无法弄清楚 VS 2017 如何读取和构建 JavaScript/TypeScript 的智能感知。 - Ashkan Hovold
现在已经是六月了,当然。我想知道你在这个问题上有没有取得进展?我成功地在VS2017中使用tsconfig.json文件让智能感知(Intellisense)生效,在修改了项目文件的TypeScriptToolsVersion节点为2.2之后。你的工具版本设置是什么? - Markus
2个回答

1

JS文件是用于JavaScript的,不使用TypeScript编译器进行转译。

如果您正在使用TypeScript,则将所有TypeScript保存在TS文件中。

此外,您不应将TypeScript放入cshtml文件中,因为TypeScript不是JavaScript。 您需要使用TypeScript编译器将TypeScript转译为JavaScript,然后可以在HTML页面中使用该JavaScript。

我认为您尝试做的事情通常不是人们使用TypeScript的方式。 通常,您会在TS文件中编写所有TypeScript代码,然后作为构建过程,将所有TypeScript代码转译为JavaScript。 有许多关于如何执行此操作的策略。 您可以将所有JavaScript捆绑到一个文件中,也可以将它们分成模块。 您可以根据自己的需求选择最终JavaScript输出的选项。

您的CSHTML视图将引用已编译的JavaScript,而不是TypeScript。 浏览器不知道如何处理TypeScript。


0

看起来最新的更新于2017年3月14日(版本号26228.09)导致了这个问题,您可以前往控制面板-程序和功能-查看已安装的更新并删除此更新,然后重新打开VS检查智能感知。如果它可以正常工作,这意味着此更新导致了此问题,您可以暂时不安装此更新。

我注意到Microsoft Report Projects for Visual Studio扩展在项目中使用时可能会导致此类问题,我的一些项目在我将SQL Server报表项目添加到解决方案并重新启动Visual Studio后立即出现问题。因此,现在我从解决方案中删除我的报表项目,但我希望Microsoft能够解决这个问题。


有没有任何来源可以验证所说的更新是否真的破坏了JavaScript的智能感知?无论如何,我似乎并没有安装那个更新,所以那不是问题的原因。而且正如之前提到的,所有上述步骤都是在一个全新的ASP.NET MVC 4.5.2项目中进行的;没有添加其他项目到解决方案中。 - Caleb Bergman
它目前在VS2017的已知问题中列出: https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes#knownissues查找标题:JavaScript IntelliSense停止工作 - Don'tQuestionMe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接