更新:我有一个解决方法,可以让事情在没有黑客的情况下正常工作。我将我之前的尝试留在下面描述的后代。请参阅工作解决方案的答案。
我刚刚将一个项目升级到 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) 有人可以告诉我我是否只是以错误的方式做这件事。
var foo = $(document);
{ "compilerOptions": { "types": [] } }
<Project>\obj\Debug\...
中制作的。 (路径较长,但我忘记记录了)obj
手动目录。 更新 2:我发现了上述方法的一些缺点。我也有更好的解决方案。
使用 tsconfig.json 有一个主要缺点。保存时重新编译的选项在 Visual Studio 中不起作用。我想让我的站点在 Debug模式下运行,对 TypeScript 进行一些更改,点击保存,然后立即看到站点中反射(reflect)的这些更改。
我认为给我带来麻烦的一件事是我的 TypeScript 文件位于 Scripts 以外的文件夹中,我保留用于应按原样部署到服务器的文件。我猜微软认为这是一个非标准用例。
在将我的头撞在墙上太久之后,我找到了一个简单但很笨拙的解决方案。我拿了这个目录下的所有子目录:
C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types
并将它们移动到名为 Deleted 的目录中。
砰。不再自动包含定义,不再有错误。
微软,如果你正在阅读,请为我的场景提供支持,重申一下:
更新 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/