TypeScript 编译器源文件位于 src/compiler
目录下
译注:Typescript Deep Dive 使用的源码应为 2016 年以前的源码。学习时请对照现有的源码
它分为以下几个关键部分:
scanner.ts
)parser.ts
)binder.ts
)checker.ts
)emitter.ts
)每个部分在源文件中均有独立文件,本章稍后会对这些部分做解释。
我们有个名为 Bring Your Own TypeScript (BYOTS) 的项目,通过暴露内部接口让编译器 API 使用起来更简单。你可以在全局范围上暴露你 TypeScript 应用的本地变量。
语法正确并不意味着语义上也正确。下面的 TypeScript 代码,语法合法,但是语义却不正确
语义
从自然语言角度意味着有意义,理解这个概念对你很有用。
以下演示简单说明 TypeScript 编译器如何将上述几个关键部分组合在一起:
符号(Symbol
)是 TypeScript 语义系统的主要构造块。如上所示,符号是绑定的结果。符号将 AST 中的声明节点与相同实体的其他声明相连。
符号和 AST 是检查器用来验证源代码语义的
最后,需要输出 JavaScript 时:
TypeScript 编译器中还有一些其他文件,为我们接下来介绍的很多关键部分提供实用工具。
core.ts
:TypeScript 编译器使用的核心工具集,重要的有:
let objectAllocator: ObjectAllocator
是一个定义为全局单例的变量。提供以下定义:
getNodeConstructor
(节点会在解析器 / AST 中介绍)getSymbolConstructor
(符号会在绑定器中介绍)getTypeConstructor
(类型会在检查器中介绍)getSignatureConstructor
(签名是索引,调用和构造签名)types.ts
包含整个编译器中使用的关键数据结构和接口,这里列出一些关键部分:
SyntaxKind
AST 节点类型通过 SyntaxKind
枚举进行识别TypeChecker
类型检查器提供此接口CompilerHost
用于程序(Program
)和系统之间的交互Node
AST 节点system.ts
,TypeScript 编译器与操作系统的所有交互均通过 System
接口进行。接口及其实现(WScript
和 Node
) 均定义在 system.ts
中。你可以将其视为操作环境(OE, Operating Environment)。
现在对主要文件有一个整体了解了,我们继续介绍程序(Program
)的概念
程序定义在 program.ts
中。编译上下文在 TypeScript 编译器中被视为一个 Program
,它包含 SourceFile
和编译选项
CompilerHost
的使用CompilerHost 是与操作环境(OE, Operating Enviornment)进行交互的机制:
用 CompilerHost
作中间层的原因是可以让接口对 Program
的需求进行细粒度的调整,而无需考虑操作环境的需求。(例如:Program
无需关心 System
的 fileExists
函数)
对System
而言还有其他的使用者(比如测试)
程序有个 API,用于获取 SourceFile:getSourceFiles(): SourceFile[];
。得到的每个元素均是一棵抽象语法树的根节点(称做 SourceFile
)