我试图了解 TypeScript 中模块解析的过程。
假设我有两个文件。 A.ts
和B.ts
以及" A"进口" B"。
模块分辨率如何工作?什么时候 ? (在编译阶段)。
解析每个文件后,构建两个AST。什么是编译器的下一阶段?
如何解决文件中的变量(或类型)" B"在档案" A"?
我有两个假设:
1。它会查看文件" B"的符号表,并进行类型检查。
2。将AST合并到一棵树中? (整个计划)
根据这些假设,我也很有兴趣知道代码生成是如何影响的 1。如果第一个假设是正确的,那么代码生成就更复杂了。因为您需要根据依赖项的顺序生成JS代码。 (它如何检测导入周期?如果A导入B,反之亦然) 2. 如果第二个假设是正确的,我觉得代码生成将更容易。 但我假设它需要做一个"拓扑排序"对于模块,在生成代码之前。
提前致谢。
答案 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的代码生成不使用或不需要类型信息。因此:
唯一的例外是const enum
,因为只要引用,枚举值就会内联到代码中。但是,由于值是内联的,因此模块排序不是问题。