【问题标题】:TypeScript module-resolution and code-generation phasesTypeScript 模块解析和代码生成阶段
【发布时间】:2017-06-10 09:30:11
【问题描述】:

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

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

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

根据这些假设,我也很想知道代码生成如何受到影响。
1.如果第一个假设是正确的,那么代码生成会更复杂.因为你需要根据依赖的顺序来生成JS代码。 (它如何检测导入周期?如果 A 导入 B,反之亦然)。
2. 如果第二个假设是正确的,我觉得代码生成会更容易做。 但我假设它需要在生成代码之前对模块进行“拓扑排序”。

提前致谢。

【问题讨论】:

    标签: typescript compiler-construction transpiler


    【解决方案1】:

    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,因为枚举值在被引用时被内联到代码中。但是,由于值是内联的,因此模块排序不是问题。

    【讨论】:

    • 感谢您的评论!
    猜你喜欢
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2018-11-10
    • 2019-05-31
    • 2016-05-13
    • 2023-01-30
    相关资源
    最近更新 更多