UPDATE:.我有一个变通办法,可以让事情顺利进行,没有黑客攻击.我把我之前的try 留给子孙后代.请参阅工作解决方案的答案.
我刚刚将一个项目升级到Visual Studio 2017,突然出现了各种类型的打字错误.其中许多是Duplicate identifier
个错误.当我双击其中一个错误时,它会打开一个名为index的文件.d、 ts,位于以下目录中:
C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types\jquery\index.d.ts
根据我在这页上读到的内容:
...现在的情况似乎是,VisualStudio正在try 为我已经手动包含定义文件的类型下载定义文件.自动包含定义文件听起来是一个很棒的功能!我会删除手动包含的,对吗?但我所做的一切似乎都不管用.我希望有人能告诉我哪里出了问题.
作为背景,我在Visual Studio 2015中的工作方式如下.我使用了三个库:jQuery、jQuery UI和QUnit.我只是下载了.d、 来自DefinitelyTyped的ts文件,并将它们放在我项目的脚本目录中,在我于VS 2017打开项目之前,一切都正常工作.
从错误消息来看,Visual Studio 2017似乎引入了自己的定义文件,所以我想我应该删除手动引入的定义文件.然而,当我这样做的时候,现在我得到了大量的Cannot find name $
个错误,这似乎意味着这些定义文件由于某种原因不再被引入.
接下来,我想问题可能是我的项目中没有JQuery(和其他库)源文件.我只是在HTML源代码中引用了谷歌的CDN.上面的链接听起来像是VisualStudio正在寻找一个实际的松散文件,作为它应该引入定义文件的指示器.所以我手动将文件添加到脚本目录并重建,但没有任何更改.
上面的链接页面还讨论了如何包含来自npm或bower的库文件,或者使用tsconfig.json文件,但在我走上这些道路之前(不是我正常工作流程的一部分),我希望有人能告诉我,在Visual Studio 2017中引入TypeScript定义有更好的方法吗?提前谢谢.
UPDATE:(参见下面的更新2)我能够让事情正常进行.这并不完全是直观的,所以我在这里分享我的步骤,希望a)这有助于某人,b)有人可以告诉我,我是否只是用了错误的方式.
- 从项目中删除所有TypeScript代码和定义文件.
- 打开Package.json并删除其中的任何定义文件引用.
- 清洁和建造.没有错误或警告.
- 通过NuGet安装所需的定义文件(例如,对于jQuery,您需要的包是"jQuery.TypeScript.DefiniteTyped").
- 这将在Scripts\typings\jquery中安装定义文件.
- 对你引用的其他库也这样做.
- 添加一个新的测试类型脚本文件,并添加一行try 使用库,例如
var foo = $(document);
- 智能感知有效!项目构建!看来我们又开始做生意了!
- 没那么快.几秒钟后,我们再次收到重复的标识符错误.似乎VisualStudio自己获取了定义文件(可能是因为我通过NuGet包含了定义文件而激活的),现在我们又发生了冲突.
- 添加tsconfig.js文件中包含以下指令,该指令阻止Visual Studio下载自己的定义文件副本:
{ "compilerOptions": { "types": [] } }
- 错误消失了.
- 别那么快!几秒钟后,出现了数百个新错误,涉及我已从项目中完全删除的TypeScript文件.打开错误窗口中引用的一个文件,似乎是在
<Project>\obj\Debug\...
中复制的(路径更长,但我忘记记录它) - 再多的清洗都无法清除这些文件.
- 手动删除整个
obj
目录. - 将我的所有原始TypeScript文件重新添加到项目中.
- 重建成功
UPDATE 2:我发现了上述方法的一些缺点.我还有一个更好的解决方案.
使用tsconfig.json有一个主要缺点.保存时重新编译的选项在Visual Studio中不起作用.我想让我的网站在调试模式下运行,对TypeScript进行一些更改,点击save,然后立即看到这些更改反映在网站上.
I think one of the things that was causing trouble for me was that I have my TypeScript files in a folder other than Scripts,,我为应该按原样部署到服务器的文件保留.我猜微软认为这是一个非标准用例.
在我的头撞在墙上太久之后,我找到了一个简单的解决方案,尽管很粗糙.我获取了这个目录中的所有子目录:
C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types
并将它们移动到一个名为"已删除"的目录.
砰.不再自动包含定义,不再出现错误.
微软,如果你正在阅读,请为我的场景提供支持,重申一下:
- 存储在除脚本以外的目录中的TypeScript文件
- 通过参考第三方CDN包含的库(如jQuery)
- 通过NuGet直接包含上述库的定义文件.
我终于成功了.有关非黑客解决方案,请参见下面的答案.