Visual Studio 2017 中的 typescript : Automatic definition inclusion causes Duplicate Identifier errors

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


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

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

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

    在将我的头撞在墙上太久之后,我找到了一个简单但很笨拙的解决方案。我拿了这个目录下的所有子目录:
    C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types
    

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

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

    微软,如果你正在阅读,请为我的场景提供支持,重申一下:
  • 存储在 Scripts 之外的目录中的 TypeScript 文件
  • 通过引用第三方 CDN 包含的库(例如 jQuery)
  • 通过 NuGet 直接包含上述库的定义文件。


  • 更新 3:我终于让它工作了。有关非hacky解决方案,请参阅下面的答案。

    最佳答案

    我让它在没有黑客的情况下工作。 诀窍是使用 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"
      ]
    }
    

    关于Visual Studio 2017 中的 typescript : Automatic definition inclusion causes Duplicate Identifier errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42663010/

    相关文章:

    javascript - 如何在 Angular 语法中应用多个 ngIf 条件?

    typescript - 从对象中提取 typescript 签名到接口(interface)中

    typescript - Typescript 的类型定义管理系统(如 tsd)的最佳解决方案是什么?

    visual-studio - 将数据集添加到报表时 Visual Studio 崩溃,无法加载文件或程序集

    c# - Visual Studio 显示 ReSharper 的 'Configure settings to improve performance' 通知

    visual-studio-2017 - p4vs 插件未在 VS2017 15.3.5 中显示

    javascript - 在 RxJS 6 中取消订阅?

    typescript - TS 4.0 可变元组和中间件模式

    reactjs - 如何从继承类覆盖 React.Component 状态类型?

    javascript - 输入 onChange w/React & TypeScript 错误 : jsx no-lambda no-bind