Як ми вже згадували раніше checker - це те, що робить TypeScript унікально потужним у порівнянні з просто ще одним транспілером JavaScript. Checker
розташований у файлі checker.ts
і на даний момент складається з понад 23 тис. рядків коду на TypeScript (найбільша частина компілятора).
Checker
ініціалізується об'єктом program
. Нижче наведений невеликий приклад стеку викликів (ми використовували той самий приклад при дослідженні binder
):
program.getTypeChecker ->
ts.createTypeChecker (in checker)->
initializeTypeChecker (in checker) ->
for each SourceFile `ts.bindSourceFile` (in binder)
// followed by
for each SourceFile `ts.mergeSymbolTable` (in checker)
Справжня перевірка типу відбувається після виклику getDiagnostics
. Ця функція викликається наприклад, коли запит зроблений до Program.emit
, в такому випадку checker
повертає EmitResolver
(програма викликає функцію getEmitResolver
чекера) який представляє собою набір функцій, локальних для createTypeChecker
. Ми ще повернемося до цього, коли будемо розглядати emitter
.
Нижче наведений стек викликів, що веде до checkSourceFile
(функції, що локально присутня у createTypeChecker
).
program.emit ->
emitWorker (program local) ->
createTypeChecker.getEmitResolver ->
// First call the following functions local to createTypeChecker
call getDiagnostics ->
getDiagnosticsWorker ->
checkSourceFile
// then
return resolver
(already initialized in createTypeChecker using a call to local createResolver())