更新:我有一个解决方法,可以让任何事情都可以接受,而且没有黑客攻击。我将下面描述的先前尝试留给子孙后代。请参阅工作解决方案的答案。
我刚刚将项目升级到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。我只是从DefinitelyTyped下载了.d.ts文件并将它们放在我项目的Scripts目录中,一切正常,直到我在VS 2017中打开项目。
从错误消息中,似乎Visual Studio 2017引入了自己的定义文件,所以我想我只是删除我手动带来的那些文件。但是,当我这样做时,现在我遇到了大量的Cannot find name $
错误,这似乎意味着这些定义文件由于某种原因不再被引入。
接下来,我想可能问题是我在项目中实际上没有JQuery(和其他库)源文件。我只是在我的HTML源代码中使用Google的CDN引用它们。上面的链接听起来像Visual Studio正在寻找一个实际的松散文件作为它应该带入定义文件的指示器。所以我手动将文件添加到我的Scripts目录并重建,但没有任何改变。
上面的链接页面还讨论了从npm或bower中包含你的库文件,或者使用tsconfig.json文件,但在我走这些道路之前(不是我正常工作流程的一部分),我希望有人可以告诉我,有没有一种在Visual Studio 2017中引入TypeScript定义的首选方法?提前谢谢。
更新:(请参阅下面的更新2)我能够让事情顺利进行。这不完全是直观的,所以我在这里分享我的步骤,希望a)它可以帮助某人,b)有人可以告诉我,我是否只是以错误的方式做这件事。
var foo = $(document);
{ "compilerOptions": { "types": [] } }
<Project>\obj\Debug\...
中创建的(路径较长但我忘记记录)obj
目录。更新2:我发现上述方法存在一些缺点。我也有更好的解决方案。
使用tsconfig.json有一个主要的缺点。在save上重新编译的选项在Visual Studio中不起作用。我希望我的网站以调试模式运行,对TypeScript进行一些更改,点击保存,然后立即看到网站中反映的那些更改。
我认为给我带来麻烦的一件事就是我将TypeScript文件放在Scripts以外的文件夹中,我保留了应该部署到服务器的文件 - 是。我想微软认为这是一个非标准的用例。
在我的头撞到墙上太长时间之后,我发现了一个简单的,虽然很笨拙的解决方案。我把这个目录中的所有子目录都占用了:
C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types
并将它们移动到名为Deleted的目录。
的Bam。不再自动包含定义,不再有错误。
微软,如果您正在阅读,请为我的方案提供支持,重申的是:
更新3:我终于让它运转了。请参阅下面的答案,了解非hacky解决方案。
答案 0 :(得分:16)
我没有黑客使用它。诀窍是使用tsconfig.json
文件并禁用自动定义包含。在我原来的问题中,我提到我试过这个,发现我无法使用compile-on-save。然而,那是因为我试图使用&#34; watch&#34;选项,当我真的应该使用&#34; compileOnSave&#34;选项。
这是我完整的工作步骤,将我原来破损的项目转换为正常运行的项目,并将继续在未经修改的Visual Studio 2017安装上正常运行。
在根目录中向项目添加tsconfig.json
文件。
至少配置您的文件:
{ "compilerOptions": { "types": [] } }
但也许还有其他选择。我的文件看起来像这样:
{
"compileOnSave": true,
"compilerOptions": {
"types": [],
"sourceMap": true,
"target": "es5",
"noEmitOnError": true
}
}
您可以在此处了解其他编译器选项: https://www.typescriptlang.org/docs/handbook/compiler-options.html
"types":[]
部分阻止自动包含定义。
这意味着您可以为您使用的任何库引入定义。幸运的是,通过NuGet非常容易。例如,对于jQuery,只需搜索jquery.TypeScript.DefinitelyTyped
并安装相应的版本。这将在Scripts/typings
下创建文件夹。
如果您以前遇到过错误,可能需要清除一些错误。清理项目,删除项目顶部的obj
目录,现在应该正确构建。当我在文件中键入内容然后再次保存时,我遇到了一些杂散错误。重新启动Visual Studio也可能正常。
更新:我发现当我发布到Azure时,我又遇到了错误。但是,当我将下面 Perfa 建议的指令添加到我的tsconfig.json文件中时,删除了我的bin和obj目录并重新启动了Visual Studio,这些错误也不再出现。我现在已经多次构建和重建并发布到Azure,它们似乎已经完全消失了。
为清楚起见,我的完整tsconfig.json文件现在看起来像这样:
{
"compileOnSave": true,
"compilerOptions": {
"types": [],
"sourceMap": true,
"target": "es5",
"noEmitOnError": true
},
"exclude": [
"node_modules",
"obj",
"bin"
]
}
答案 1 :(得分:6)
安装VS 2017后出现此错误。为了摆脱它,我用obj和bin更新了我的tsconfig.json排除部分。
"exclude": [
"node_modules",
"obj",
"bin"
]
答案 2 :(得分:1)
我在更新到VS 2017的旧应用程序中遇到了这个问题,并通过遵循harley.333的答案修改了它 - 修改安装以包含TypeScript 2.0 SDK。
我没有代表发表评论,但要找到它,你必须将标签翻转到“个别组件”,然后它就是最后一个分组,“SDK,库和框架。”