Исходный код компилятора TypeScript находится в папке src/compiler
.
Он разделен на следующие ключевые части:
- Scanner (
scanner.ts
) - Parser (
parser.ts
) - Binder (
binder.ts
) - Checker (
checker.ts
) - Emitter (
emitter.ts
)
Каждый из них получает свои уникальные файлы в исходном коде.. Эти части будут объяснены позже в этой главе.
У нас есть проект Bring Your Own TypeScript (BYOTS), который упрощает работу с API компилятора например раскрывая внутренние API. Вы можете использовать его в вашем локальном приложении для доступа к глобальной версии TypeScript
Просто потому, что что-то синтаксически правильно, не означает, что это семантически правильно. CРассмотрим следующий фрагмент кода TypeScript, который хотя и синтаксически корректен, но семантически неверен.
var foo: number = "not a number";
Semantic
означает «смысл» на английском языке. Эту концепцию полезно иметь в голове.
Ниже приводится краткий обзор того, как составляются эти ключевые части компилятора TypeScript:
SourceCode ~~ scanner ~~> Token Stream
Token Stream ~~ parser ~~> AST
AST ~~ binder ~~> Symbols
Символ
это основной строительный блок семантической системы TypeScript. Как показано символы создаются в результате связывания. Символы соединяют узлы объявлений в AST с другими объявлениями, относящимися к тому же объекту.
Символы + AST — это то, что используется программой проверки для семантической проверки исходного кода.
AST + Symbols ~~ checker ~~> Type Validation
Наконец, когда запрашивается вывод JS:
AST + Checker ~~ emitter ~~> JS
В компиляторе TypeScript есть несколько дополнительных файлов, которые предоставляют утилиты для многих из этих ключевых частей, которые мы рассмотрим далее.
core.ts
: основные утилиты используемые компилятором в TypeScript. Несколько важных:
let objectAllocator: ObjectAllocator
: это переменная обьявленная как одноэлементная глобальная. Он предоставляет определения дляgetNodeConstructor
(Узлы рассматриваются, когда мы смотрим наparser
/AST
),getSymbolConstructor
(Символы обернуты вbinder
),getTypeConstructor
(Типы описаны вchecker
),getSignatureConstructor
(Signatures — это индекс, вызов и построение signatures).
types.ts
содержит ключевые структуры данных и интерфейсы, используемые компилятором. Вот выборка из нескольких ключевых:
SyntaxKind
Тип узла AST определяется перечислениемSyntaxKind
.TypeChecker
Это интерфейс, предоставляемый TypeChecker.CompilerHost
Это используетсяProgram
для взаимодействия сSystem
.Node
Узел AST.
system.ts
. Все взаимодействие компилятора TypeScript с операционной системой происходит через System
интерфейс.И интерфейс, и его реализации (WScript
и Node
) определеныsystem.ts
. Вы можете думать об этом как об Операционной Среде (OС).
Теперь, когда у вас есть обзор основных файлов, мы можем рассмотреть концепцию Program
.