【问题标题】:Typescript - migrating JS code with strict flagsTypescript - 使用严格标志迁移 JS 代码
【发布时间】:2019-04-01 10:22:39
【问题描述】:

我开始将大型 JS 代码库迁移到 TS 中。

按照Migrating from JavaScript 文档中的建议,我首先将tsconfig.json 文件设置为allowJs: true

迁移过程是每当我将新文件添加到代码库中时,我都会将其添加到 TS 中。

由于我希望对这些新的 TS 文件尽可能严格,因此我在 tsconfig.json 文件中添加了不同的严格性选项,例如 "noImplicitAny": true, "noImplicitThis": true

问题是,一旦我这样做了,我的所有非迁移 JS 文件都会出现大量错误,当然,这些文件缺少不同参数的类型,因此具有隐式 any 类型。

在这种情况下建议的工作流程是什么? 如上所述,我想:

  • 对我创建的新 TS 文件尽可能严格。
  • 对我的 JS 文件运行 TS 标准检查,例如unreached codeunused variables
  • 对我的 JS 文件没有相同的 TS 严格性,因为这仅仅意味着我需要立即将所有代码迁移到 TS,这实际上是不可行的。

对于 JS 和 TS 文件是否有可能使用不同的 tsconfig.json 文件?

这里的最佳做法是什么?

编辑:

正如马特在下面的评论中提到的,我确实使用了 checkJs: true 标志,这导致了 JS 文件中的编译错误。

我了解到,即使没有将 JS 文件移植到 TS,即使使用 .js 文件,您也会收到“开箱即用”的类型检查,但我不会这样做。

没有checkJs 标志,我会收到Unreachable code detected'x' is declared but is never used 警告,但似乎就是这样。 出于某种原因,我确信它也会捕获以下内容:

let num = 12;
num = "aa";

但它没有描述任何警告(智能感知并不“知道”num 的类型为 number)。

当再次阅读Migrating from JavaScript 文章(“早期福利”部分)时,我可以看到它确实表明我得到的只是非常有限的打字检查支持。

所以在我结束这个问题之前的最后一件事 - 这是某种可配置的还是仅此而已?

【问题讨论】:

  • 除非您打开 checkJs 选项(默认关闭)或添加 // @ts-check 注释,否则您的 JavaScript 文件中不应出现任何隐含错误。确保您没有做任何这些事情,如果您仍然遇到错误,请发布一个重现问题的存储库,以便我查看。
  • 谢谢@MattMcCutchen,我编辑了我的问题。

标签: javascript typescript tsconfig


【解决方案1】:

您确实必须使用两个tsconfig.json 文件,一个带有"noImplicitAny": true(和任何类似选项)但不是"checkJs": true,另一个带有"checkJs": true 但不是"noImplicitAny": true。让您的构建系统在每个tsconfig.json 文件上运行一次tsc 并显示所有错误应该很简单。您可能希望在两个文件之一中设置"noEmit": true。 (如果您需要这方面的帮助,请告诉我。)

如果您使用 Visual Studio Code 作为您的 IDE,那么根据我的简短测试,似乎没有办法让 Visual Studio Code 的 TypeScript 语言服务(在您编辑时用于错误报告)应用不同的tsconfig.json 文件到你的 TypeScript 和 JavaScript 源文件(除非你可以将文件分成两个文件夹,依赖项只在一个方向,这似乎不是你的场景)。因此,您必须选择两种配置中的一种作为主要配置,并参考构建输出以了解仅由其他配置检测到的错误。 (我不能代表其他 IDE。)

【讨论】:

  • 只是为了确保我理解,如果我对所有 .ts 文件使用严格的 tsconfig.json,然后创建另一个 tsconfig.jsfiles.json 以使用不太严格的编译器选项扩展第一个配置文件包含所有**/*.js文件,为什么VS代码依赖会出现问题?
  • 如果您这样做,VS Code TypeScript 语言服务将只查看tsconfig.json,并且不会报告您的 JavaScript 文件中的任何类型错误。
  • 我明白了。是否可以添加类似于//@ts-check 的注释,仅使用更多参数来控制严格标志?类似于// @ts-check @noImplicitAny=false ... 的东西?
  • 不,// @ts-check 是开-关。
  • 对于到达这里并希望以某种方式实现这一点的人来说,the following github issue 表示目前这按设计是不可能的。
猜你喜欢
  • 2016-02-26
  • 2016-02-10
  • 2015-05-06
  • 2017-12-12
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
相关资源
最近更新 更多