Visual Studio 2017中的TypeScript:自动定义包含导致重复标识符错误

时间:2017-03-08 04:25:38

标签: typescript typescript-typings visual-studio-2017

更新:我有一个解决方法,可以让任何事情都可以接受,而且没有黑客攻击。我将下面描述的先前尝试留给子孙后代。请参阅工作解决方案的答案。

我刚刚将项目升级到Visual Studio 2017,我突然遇到各种类型的TypeScript错误。其中许多是Duplicate identifier错误。当我双击其中一个错误时,它会打开一个名为index.d.ts的文件,该文件位于以下目录中:

C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types\jquery\index.d.ts

根据我在此页面上阅读的内容:

https://blogs.msdn.microsoft.com/visualstudio/2016/11/28/more-productive-javascript-in-visual-studio-2017-rc/

......似乎正在发生的事情是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)有人可以告诉我,我是否只是以错误的方式做这件事。

  1. 从项目中删除所有TypeScript代码和定义文件。
  2. 打开packages.json并删除任何定义文件引用。
  3. 清洁和建造。没有错误或警告。
  4. 通过NuGet,安装您需要的定义文件(例如,对于jQuery,您需要的包是" jquery.TypeScript.DefinitelyTyped")。
  5. 这将在Scripts \ typings \ jquery。
  6. 中安装定义文件
  7. 对您引用的其他库执行相同的操作。
  8. 添加新的测试TypeScript文件并添加尝试使用库的行,例如var foo = $(document);
  9. 智能感知工作!项目建设!看起来我们又回来了!
  10. 没那么快。几秒钟后,我们再次收到重复的标识符错误。似乎Visual Studio自己选择了定义文件(可能是通过我通过NuGet包含定义文件激活的),现在又出现了冲突。
  11. 使用以下指令添加tsconfig.js文件,这会阻止Visual Studio下载自己的定义文件副本:{ "compilerOptions": { "types": [] } }
  12. 错误消失。
  13. 不是那么快!几秒钟后,出现了数百个新错误,引用了我已从项目中完全删除的TypeScript文件。打开错误窗口中引用的其中一个文件,看起来副本是在<Project>\obj\Debug\...中创建的(路径较长但我忘记记录)
  14. 无需清理解决方案就可以清除这些文件。
  15. 手动删除整个obj目录。
  16. 将我原来的所有TypeScript文件添加回项目中。
  17. 重建。成功了!
  18. 更新2:我发现上述方法存在一些缺点。我也有更好的解决方案。

    使用tsconfig.json有一个主要的缺点。在save上重新编译的选项在Visual Studio中不起作用。我希望我的网站以调试模式运行,对TypeScript进行一些更改,点击保存,然后立即看到网站中反映的那些更改。

    我认为给我带来麻烦的一件事就是我将TypeScript文件放在Scripts以外的文件夹中,我保留了应该部署到服务器的文件 - 是。我想微软认为这是一个非标准的用例。

    在我的头撞到墙上太长时间之后,我发现了一个简单的,虽然很笨拙的解决方案。我把这个目录中的所有子目录都占用了:

    C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types
    

    并将它们移动到名为Deleted的目录。

    的Bam。不再自动包含定义,不再有错误。

    微软,如果您正在阅读,请为我的方案提供支持,重申的是:

    • 存储在Scripts以外的目录中的TypeScript文件
    • 通过引用第三方CDN包含的库(例如jQuery)
    • 直接通过NuGet包含上述库的定义文件。

    更新3:我终于让它运转了。请参阅下面的答案,了解非hacky解决方案。

3 个答案:

答案 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,库和框架。”

Install Typescript SDK Screenshot