TypeScript 一次检查多个模块格式

ffvjumwh  于 7个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(51)

(#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 类型检查失败;因此没有单一的最严格类型检查模式;为了保证正确性,我需要针对我们发出的所有模块格式进行类型检查,然后在例如函数体中的任何类型错误中重复这些错误。消除这些错误将是主要的好处。

fdbelqdn

fdbelqdn1#

根据我的评论和以下配置:

{
  "compilerOptions": {
    "outDir": "./dist",
    "emit": [
      { "module": "CommonJS", "declaration": true },
      { "module": "ESNext", "extension": "mjs" },
    ]
  }
}

理论上,可以运行 tsc --noEmit ,TS编译器仍然需要使用 emit 编译选项来查看要检查的类型。
我认为这很有意义。

wi3ka0sx

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 输出所有构件。

相关问题