(#15833 的另一面)
搜索词
检查多个模块格式的类型
建议
对于编译为多种输出格式的项目 - 例如不同的 module
输出 - 能够一次发出多个格式的错误对于类型检查是有用的。
需要重复类型检查的原因是,基于模块的类型检查略有不同 - 例如,对于 CommonJS / AMD,export =
和 import foo = require(...)
都是合法的,而在 ESNext 中它们不是;ESNext 有 import.meta
,在某些情况下,顶级 await
,这是 AMD/Commonjs 不支持的。所以没有一个单一的 module
目标具有最严格的类型检查。
好处是:
- 节省 CPU 时间
- 无需多次运行类型检查并在它们之间重复大部分错误
就我而言,我不确定它会带来很多意义 - 例如,在 compilerOptions
中,module
字段可以接受一个模块数组,或者我们可以使用一个新的字段来表示这个;尽管与 emit for multiple module types (#15833) 结合使用,我们可以保持这样一个不变式:tsc 用与它发出的相同的模块进行类型检查。
用例
如果我将代码编译为 AMD 和 ESNext,仅针对 AMD 或仅针对 ESNext 进行类型检查,并不能保证我的代码对其他模块格式有效 - 一个 export =
将导致 ESNext 类型检查失败,而一个 import.meta
将导致 AMD 类型检查失败;因此没有单一的最严格类型检查模式;为了保证正确性,我需要针对我们发出的所有模块格式进行类型检查,然后在例如函数体中的任何类型错误中重复这些错误。消除这些错误将是主要的好处。
2条答案
按热度按时间fdbelqdn1#
根据我的评论和以下配置:
理论上,可以运行
tsc --noEmit
,TS编译器仍然需要使用emit
编译选项来查看要检查的类型。我认为这很有意义。
wi3ka0sx2#
从 tweet 的Angular 来看这个问题
在 AWS SDK for JavaScript (v3) 中,我们目前有三个目标:commonjs(适用于 Node.js),es5(适用于浏览器)和 types(适用于 TypeScript 用户)。
我们计划添加三个新目标:esm(适用于 Node.js ESM),modern-web(适用于现代浏览器)和 debug(包含用于调试的源Map)。
根据当前设置,我们将不得不编写六个不同的 TSConfig 并使用每个配置运行 typescript。
如果提供了
emit
选项,我们将能够使用单个 TSConfig 输出所有构件。