UPDATE:.我有一个变通办法,可以让事情顺利进行,没有黑客攻击.我把我之前的try 留给子孙后代.请参阅工作解决方案的答案.


我刚刚将一个项目升级到Visual Studio 2017,突然出现了各种类型的打字错误.其中许多是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/

...现在的情况似乎是,VisualStudio正在try 为我已经手动包含定义文件的类型下载定义文件.自动包含定义文件听起来是一个很棒的功能!我会删除手动包含的,对吗?但我所做的一切似乎都不管用.我希望有人能告诉我哪里出了问题.

作为背景,我在Visual Studio 2015中的工作方式如下.我使用了三个库:jQuery、jQuery UI和QUnit.我只是下载了.d、 来自DefinitelyTyped的ts文件,并将它们放在我项目的脚本目录中,在我于VS 2017打开项目之前,一切都正常工作.

从错误消息来看,Visual Studio 2017似乎引入了自己的定义文件,所以我想我应该删除手动引入的定义文件.然而,当我这样做的时候,现在我得到了大量的Cannot find name $个错误,这似乎意味着这些定义文件由于某种原因不再被引入.

接下来,我想问题可能是我的项目中没有JQuery(和其他库)源文件.我只是在HTML源代码中引用了谷歌的CDN.上面的链接听起来像是VisualStudio正在寻找一个实际的松散文件,作为它应该引入定义文件的指示器.所以我手动将文件添加到脚本目录并重建,但没有任何更改.

上面的链接页面还讨论了如何包含来自npm或bower的库文件,或者使用tsconfig.json文件,但在我走上这些道路之前(不是我正常工作流程的一部分),我希望有人能告诉我,在Visual Studio 2017中引入TypeScript定义有更好的方法吗?提前谢谢.


UPDATE:(参见下面的更新2)我能够让事情正常进行.这并不完全是直观的,所以我在这里分享我的步骤,希望a)这有助于某人,b)有人可以告诉我,我是否只是用了错误的方式.

  1. 从项目中删除所有TypeScript代码和定义文件.
  2. 打开Package.json并删除其中的任何定义文件引用.
  3. 清洁和建造.没有错误或警告.
  4. 通过NuGet安装所需的定义文件(例如,对于jQuery,您需要的包是"jQuery.TypeScript.DefiniteTyped").
  5. 这将在Scripts\typings\jquery中安装定义文件.
  6. 对你引用的其他库也这样做.
  7. 添加一个新的测试类型脚本文件,并添加一行try 使用库,例如var foo = $(document);
  8. 智能感知有效!项目构建!看来我们又开始做生意了!
  9. 没那么快.几秒钟后,我们再次收到重复的标识符错误.似乎VisualStudio自己获取了定义文件(可能是因为我通过NuGet包含了定义文件而激活的),现在我们又发生了冲突.
  10. 添加tsconfig.js文件中包含以下指令,该指令阻止Visual Studio下载自己的定义文件副本:{ "compilerOptions": { "types": [] } }
  11. 错误消失了.
  12. 别那么快!几秒钟后,出现了数百个新错误,涉及我已从项目中完全删除的TypeScript文件.打开错误窗口中引用的一个文件,似乎是在<Project>\obj\Debug\...中复制的(路径更长,但我忘记记录它)
  13. 再多的清洗都无法清除这些文件.
  14. 手动删除整个obj目录.
  15. 将我的所有原始TypeScript文件重新添加到项目中.
  16. 重建成功

UPDATE 2:我发现了上述方法的一些缺点.我还有一个更好的解决方案.

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

I think one of the things that was causing trouble for me was that I have my TypeScript files in a folder other than Scripts,,我为应该按原样部署到服务器的文件保留.我猜微软认为这是一个非标准用例.

在我的头撞在墙上太久之后,我找到了一个简单的解决方案,尽管很粗糙.我获取了这个目录中的所有子目录:

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

并将它们移动到一个名为"已删除"的目录.

砰.不再自动包含定义,不再出现错误.

微软,如果你正在阅读,请为我的场景提供支持,重申一下:

  • 存储在除脚本以外的目录中的TypeScript文件
  • 通过参考第三方CDN包含的库(如jQuery)
  • 通过NuGet直接包含上述库的定义文件.

我终于成功了.有关非黑客解决方案,请参见下面的答案.

推荐答案

I got it working with no hacks.诀窍是使用tsconfig.json文件并禁用自动定义包含.在我最初的问题中,我提到我try 了这个方法,发现我无法在保存时使用compile.然而,那是因为我试图使用"watch"选项,而我本应该使用"compileOnSave"选项.

下面是我的一整套工作步骤,可以将我原来的、不完整的项目转换为一个正常工作的项目.

在根目录中将tsconfig.json文件添加到项目中.

将文件配置为至少:

{ "compilerOptions": { "types": [] } }

但也许有其他你喜欢的 Select .我的文件如下所示:

{
  "compileOnSave": true,
  "compilerOptions": {
    "types": [],
    "sourceMap": true,
    "target": "es5",
    "noEmitOnError": true
  }
}

您可以在此处了解其他编译器选项:

这是防止自动包含定义的"types":[]部分.

这意味着你可以为你使用的任何库引入定义.幸运的是,通过NuGet非常容易.例如,对于jQuery,只需搜索jquery.TypeScript.DefinitelyTyped并安装适当的版本.这将在Scripts/typings下创建文件夹.

如果你以前有错误,你可能需要清除一些积垢.清理你的项目delete the 100 directory at the top of your project's directory structure,它现在应该可以正确构建了.当我在文件中键入一些内容,然后再次保存时,我有几个错误消失了.重新启动VisualStudio也可能是合适的.

祝你好运


UPDATE:我发现当我发布到Azure时,我又犯了错误.然而,当我将下面Perfa建议的指令添加到我的tsconfig时.json文件,删除我的bin和obj目录,重新启动Visual Studio,这些错误也不再出现.我现在已经在Azure上构建、重建和发布了好几次,它们似乎真的消失了.

为了清楚起见,我的完整配置.json文件现在如下所示:

{
  "compileOnSave": true,
  "compilerOptions": {
    "types": [],
    "sourceMap": true,
    "target": "es5",
    "noEmitOnError": true
  },
  "exclude": [
    "node_modules",
    "obj",
    "bin"
  ]
}

Typescript相关问答推荐

无法访问Nextjs中的本地存储

如何推断哪个特定密钥与泛型匹配?

如何通过TypeScript中的工厂函数将区分的联合映射到具体的类型(如类)?

Next.js错误:不变:页面未生成

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

从子类构造函数推断父类泛型类型

如何使用Geojson模块和@Types/Geojson类型解析TypeScrip中的GeoJSON?

是否将自动导入样式从`~/目录/文件`改为`@/目录/文件`?

如何在脚本中输入具有不同数量的泛型类型变量的函数?

我怎样才能正确地输入这个函数,使它在没有提供正确的参数时出错

创建依赖函数参数的类型

为什么TypeScrip不能解析对象析构中的赋值?

Cypress-验证别名的存在或将别名中的文本与';if';语句中的字符串进行比较

字幕子集一个元组的多个元素

如何避免多个类型参数重复?

类型脚本中函数重载中的类型推断问题

递归JSON类型脚本不接受 node 值中的变量

两个接口的TypeScript并集,其中一个是可选的

如何让Record中的每个值都有独立的类型?

为什么 Typescript 无法正确推断数组元素的类型?