TypeScript模块分辨率和代码生成阶段

时间:2017-06-10 09:30:12

标签: typescript compiler-construction transpiler

我试图了解 TypeScript 中模块解析的过程。

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

TypeScript不会将文件合并在一起;它会生成import个语句,require个调用或define个调用,具体取决于tsconfig的"module"配置的值。 (查看this page of the handbook上的--module)因此,TypeScript永远不必担心循环依赖或合并AST。

在您的示例中,“A.ts”编译为“A.js”,“B.ts”编译为“B.js”。

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

  • 可能存在数百种类型错误,如果类型错误被消除,代码仍将完全相同地编译
  • 您可以编译纯JavaScript代码,例如,将ES2015降级为ES3。

唯一的例外是const enum,因为只要引用,枚举值就会内联到代码中。但是,由于值是内联的,因此模块排序不是问题。