我开始将大型 JS 代码库迁移到 TS。
按照 Migrating from JavaScript 中的建议文档中,我首先将 tsconfig.json
文件设置为 allowJs: true
。
迁移过程是,每当我向代码库添加新文件时,我都会将其添加到 TS 中。
由于我希望对这些新 TS 文件尽可能严格,因此我在 tsconfig.json
文件中添加了不同的严格选项,例如 "noImplicitAny": true, “noImplicitThis”:true
。
事情是,一旦我这样做,我的所有未迁移的 JS 文件都会出现大量错误,当然,这些文件缺乏不同参数的类型,因此具有隐式 any
类型。
在这种情况下建议的工作流程是什么? 如上所述,我想要:
- 对我创建的新 TS 文件尽可能严格。
- 对我的 JS 文件运行 TS 标准检查,例如
未到达的代码
或未使用的变量
。 - 我的 JS 文件没有同样的 TS 严格性,因为这仅仅意味着我需要将所有代码直接迁移到 TS,这实际上并不可行。
JS 和 TS 文件是否可以使用不同的 tsconfig.json
文件?
这里的最佳实践是什么?
编辑:
正如 Matt 在下面的评论中提到的,我确实使用了 checkJs: true
标志,这就是导致 JS 文件中编译错误的原因。
我知道,即使不将 JS 文件移植到 TS,即使您使用 .js 文件,您也会收到“开箱即用”的类型检查,但这对我来说并没有发生。
如果没有 checkJs
标志,我会收到 检测到无法访问的代码
和 'x' 已声明但从未使用
警告,但这似乎就这样吧。
出于某种原因,我确信它也会捕获如下内容:
let num = 12;
num = "aa";
但它没有描述任何警告(并且智能感知不“知道”num
是 number
类型)。
阅读 Migrating from JavaScript 时再次阅读文章(“早期好处”部分),我可以看到它确实表明我得到的只是非常有限的打字检查支持。
所以在我结束这个问题之前的最后一件事 - 这是可以配置的还是仅此而已?
最佳答案
您确实必须使用两个 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。)
关于javascript - Typescript - 使用严格标志迁移 JS 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53029363/