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

Posted

技术标签:

【中文标题】Visual Studio 2017 中的 TypeScript:自动定义包含导致重复标识符错误【英文标题】:TypeScript in Visual Studio 2017: Automatic definition inclusion causes Duplicate Identifier errors 【发布时间】:2017-07-28 12:42:39 【问题描述】:

更新:我有一个解决方法,可以让事情在没有黑客的情况下可以接受。我将我之前的尝试留在下面,以供后代使用。查看有效解决方案的答案。


我刚刚将一个项目升级到 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。我只是从 DefinitiveTyped 下载了 .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)有人可以告诉我我是否只是以错误的方式这样做。

    从项目中删除所有 TypeScript 代码和定义文件。 打开 packages.json 并删除其中的所有定义文件引用。 清理和构建。没有错误或警告。 通过NuGet,安装你需要的定义文件(比如jQuery,你要的包是“jquery.TypeScript.DefinitelyTyped”)。 这将在 Scripts\typings\jquery 中安装定义文件。 对您引用的其他库执行相同操作。 添加一个新的测试 TypeScript 文件并添加一行尝试使用库,例如​​,var foo = $(document); IntelliSense 有效!项目建设!看来我们又开始营业了! 没那么快。几秒钟后,我们再次收到重复标识符错误。似乎 Visual Studio 自己获取了定义文件(可能是我通过 NuGet 包含定义文件而激活的),现在我们又遇到了冲突。 使用以下指令添加 tsconfig.js 文件,以防止 Visual Studio 下载自己的定义文件副本: "compilerOptions": "types": [] 错误消失了。 没那么快!几秒钟后,出现了数百个新错误,这些错误引用了我从项目中完全删除的 TypeScript 文件。打开错误窗口中引用的文件之一,似乎是在<Project>\obj\Debug\... 中制作了副本(路径较长,但我忘记记录了) 再多的清理解决方案都无法删除这些文件。 手动删除整个obj 目录。 将我所有的原始 TypeScript 文件重新添加到项目中。 重建。成功!

更新 2: 我发现上述方法存在一些缺点。我也有更好的解决方案。

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

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

在将我的头撞到墙上太久之后,我找到了一个简单但很老套的解决方案。我把这个目录下的所有子目录都拿了:

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

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

巴姆。不再自动包含定义,不再出现错误。

Microsoft,如果您正在阅读,请为我的方案提供支持,重申一下:

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

更新 3: 我终于让它工作了。请参阅下面的答案以获取非 hacky 解决方案。

【问题讨论】:

这是对我也正在经历的确切症状的精彩记录。希望有人注意到。我没有在我的项目中使用 Node,但我仍然不喜欢应该由 Visual Studio 控制的人工处理目录的想法。 【参考方案1】:

我没有破解它就可以工作。诀窍是使用tsconfig.json 文件并禁用自动定义包含。在我最初的问题中,我提到我试过这个,发现我不能使用 compile-on-save。然而,那是因为我试图使用“watch”选项,而我真的应该使用“compileOnSave”选项。

这是我的完整工作步骤集,可将我的原始损坏项目转变为正常运行的项目并将继续在未修改的 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"
  ]

【讨论】:

【参考方案2】:

安装 VS 2017 后出现此错误。为了摆脱它,我用 obj 和 bin 更新了我的 tsconfig.json 排除部分。

"exclude": [
    "node_modules",
    "obj",
    "bin"
  ]

【讨论】:

谢谢,佩尔法!我已在回复中将此添加到我的示例 tsconfig.json 文件中。这解决了我在发布到 Azure 时看到的问题。【参考方案3】:

我在更新到 VS 2017 的旧应用程序中遇到了这个确切的问题,并按照 harley.333 的回答修复了它 - 修改安装以包含 TypeScript 2.0 SDK。

我没有代表发表评论,但要找到它,您必须将选项卡翻转到“单个组件”,然后它位于最后一组“SDK、库和框架”上。

Install Typescript SDK Screenshot

【讨论】:

谢谢,威尔!我能够找到该选项,现在我已经安装了 TypeScript 2.0 和 2.1 SDK 包。不幸的是,我仍然看到与以前相同的行为。我还在一个简化的项目中尝试了这个,它以普通的方式完成所有操作(Scripts 目录中的 TypeScript 文件,通过 NuGet 在项目中包含 jQuery 文件),除非我也包含来自 NuGet 的定义文件,否则它不会编译。但随后我再次收到重复的标识符错误。在这一点上,我不明白自动定义包含应该在什么场景下工作。 是的 - 所有重复的错误都使用我的解决方案返回(所以我删除了它)。我回到第一方。从好的方面来说,这些错误并不是致命的。一切仍然可以编译和工作 - 只是非常非常烦人。

以上是关于Visual Studio 2017 中的 TypeScript:自动定义包含导致重复标识符错误的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2017 中的远程调试

Visual Studio 2015/2017 中的 TSLint?

Visual studio 2017怎么注册激活

[转]Visual Studio 项目类型 GUID 清单

Visual Studio 2017 中的 Nuget CLI - 如何运行?

visual studio 2017没法安装,总在visual studio installer界面闪推