TypeScript 模块解析和代码生成阶段

TypeScript module-resolution and code-generation phases

我正在尝试了解 TypeScript 中模块解析的过程。

假设我有两个文件。 A.tsB.ts,以及 "A" 导入 "B"。
模块分辨率如何工作?什么时候 ? (在编译器阶段)。

解析每个文件并构建两个 AST 之后。编译器的下一阶段是什么?
它如何知道在文件 "A" 中解析文件 "B" 中的变量(或类型)?
我有两个假设:
1. 它查看文件 "B" 的符号 table,并进行类型检查。
2. 将 AST 合并到一棵树中? (整个计划)

根据这些假设,我也很想知道代码生成如何受其影响。
1.如果第一个假设是正确的,代码生成就更复杂了。因为您需要根据依赖项的顺序生成 JS 代码。 (它如何检测导入周期?如果 A 导入 B,反之亦然)。
2. 如果第二个假设是正确的,我觉得代码生成会更容易做。 但我假设在生成代码之前,它需要为模块做一个"topological sort"。

提前致谢。

TypeScript 不会将文件合并在一起;它根据 tsconfig 的 "module" 配置的值生成 import 语句、require 调用或 define 调用。 (查看 this page of the handbook 上的 --module)因此,TypeScript 从不需要担心循环依赖或合并 AST。

在你的例子中,"A.ts"被编译成"A.js","B.ts"被编译成"B.js"。

此外,TypeScript 的代码生成不使用也不需要类型信息。正因如此:

  • 可能有数百个类型错误,如果类型错误被消除,代码仍将以相同的方式编译
  • 您可以编译纯 JavaScript 代码,例如,将 ES2015 降级为 ES3。

唯一的例外是 const enums,因为无论何时引用枚举值都会内联到代码中。但是,由于值是内联的,因此模块排序不是问题。