TypeScript v5.9.3 provides a comprehensive compiler API with 1,683+ public API members for programmatically analyzing, transforming, and emitting JavaScript code.
import * as ts from 'typescript';
// or
const ts = require('typescript');import * as ts from 'typescript';
// 1. Parse source code into AST
const sourceFile = ts.createSourceFile(
'example.ts',
'const x: number = 42;',
ts.ScriptTarget.Latest,
true
);
// 2. Create program for type checking
const program = ts.createProgram({
rootNames: ['example.ts'],
options: { target: ts.ScriptTarget.ES2020 }
});
// 3. Get type checker
const checker = program.getTypeChecker();
// 4. Traverse AST
function visit(node: ts.Node) {
console.log(ts.SyntaxKind[node.kind]);
ts.forEachChild(node, visit);
}
visit(sourceFile);
// 5. Emit JavaScript
const emitResult = program.emit();Goal: Parse TypeScript source code and analyze its structure.
Pattern:
createSourceFile() to parse code into ASTcreateProgram() for type checkingprogram.getTypeChecker() for type analysisforEachChild() or visitNode()APIs:
createSourceFile() - Parse source text into ASTcreateProgram() - Create compilation programprogram.getTypeChecker() - Get type checker for semantic analysisforEachChild() - Traverse AST nodesSee: Core Compilation APIs | AST Nodes | Type System
Goal: Modify TypeScript code programmatically.
Pattern:
transform() or integrate with program.emit() via CustomTransformersTransformationContext.factory to create/modify nodesvisitEachChild() to traverse and transformAPIs:
transform() - Apply transformers to source filesTransformerFactory - Create custom transformersTransformationContext.factory - Node factory for transformationsvisitEachChild() - Visit and transform child nodesSee: Transformation | Node Factory
Goal: Programmatically generate TypeScript code.
Pattern:
factory constant to create AST nodesPrinter to convert AST to source codeprogram.emit() to generate JavaScriptAPIs:
factory - Node factory (300+ methods)createPrinter() - Create printer for AST to source conversionprogram.emit() - Emit JavaScript outputSee: Node Factory | Utilities
Goal: Implement editor features like completions, diagnostics, refactorings.
Pattern:
LanguageServiceHost implementationcreateLanguageService() to create servicegetCompletionsAtPosition(), getQuickInfoAtPosition()APIs:
createLanguageService() - Create language serviceLanguageService - 100+ methods for IDE featuresLanguageServiceHost - Host interface for file operationsSee: Language Service
Goal: Resolve module imports and type references.
Pattern:
resolveModuleName() for module resolutionresolveTypeReferenceDirective() for type referencesModuleResolutionHost for file system operationsModuleResolutionCache for performanceAPIs:
resolveModuleName() - Resolve module importsresolveTypeReferenceDirective() - Resolve type referencesModuleResolutionHost - File system interfaceSee: Module Resolution
Goal: Build TypeScript projects with incremental compilation.
Pattern:
createSolutionBuilder() for multi-project buildsBuilderProgramAPIs:
createSolutionBuilder() - Multi-project buildscreateIncrementalProgram() - Incremental compilationBuilderProgram - Incremental program interfaceSee: Solution Builder | Core Compilation
TypeScript's compiler API consists of these major subsystems:
function createProgram(
rootNames: readonly string[],
options: CompilerOptions,
host?: CompilerHost,
oldProgram?: Program,
configFileParsingDiagnostics?: readonly Diagnostic[]
): Program;
interface Program {
getRootFileNames(): readonly string[];
getSourceFiles(): readonly SourceFile[];
getSourceFile(fileName: string): SourceFile | undefined;
getTypeChecker(): TypeChecker;
emit(
targetSourceFile?: SourceFile,
writeFile?: WriteFileCallback,
cancellationToken?: CancellationToken,
emitOnlyDtsFiles?: boolean,
customTransformers?: CustomTransformers
): EmitResult;
getSemanticDiagnostics(sourceFile?: SourceFile): readonly Diagnostic[];
getSyntacticDiagnostics(sourceFile?: SourceFile): readonly Diagnostic[];
getCompilerOptions(): CompilerOptions;
}enum SyntaxKind {
Unknown = 0,
Identifier = 80,
// ... 359 syntax kinds total
}
interface Node {
readonly kind: SyntaxKind;
readonly flags: NodeFlags;
readonly parent: Node;
getSourceFile(): SourceFile;
getText(sourceFile?: SourceFile): string;
forEachChild<T>(cbNode: (node: Node) => T | undefined): T | undefined;
}
function forEachChild<T>(
node: Node,
cbNode: (node: Node) => T | undefined
): T | undefined;interface TypeChecker {
getTypeAtLocation(node: Node): Type;
getSymbolAtLocation(node: Node): Symbol | undefined;
getTypeOfSymbolAtLocation(symbol: Symbol, node: Node): Type;
getPropertiesOfType(type: Type): Symbol[];
getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[];
typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string;
// ... 150+ more methods
}
interface Type {
flags: TypeFlags;
symbol: Symbol;
getProperties(): Symbol[];
getCallSignatures(): readonly Signature[];
}const factory: NodeFactory;
interface NodeFactory {
createSourceFile(statements: readonly Statement[], endOfFileToken: EndOfFileToken, flags: NodeFlags): SourceFile;
createIdentifier(text: string): Identifier;
createVariableStatement(modifiers: readonly Modifier[] | undefined, declarationList: VariableDeclarationList): VariableStatement;
createFunctionDeclaration(modifiers: readonly ModifierLike[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): FunctionDeclaration;
// ... 300+ more factory functions
}function createLanguageService(
host: LanguageServiceHost,
documentRegistry?: DocumentRegistry,
syntaxOnlyOrLanguageServiceMode?: boolean | LanguageServiceMode
): LanguageService;
interface LanguageService {
getCompletionsAtPosition(fileName: string, position: number, options?: GetCompletionsAtPositionOptions): WithMetadata<CompletionInfo> | undefined;
getQuickInfoAtPosition(fileName: string, position: number): QuickInfo | undefined;
getDefinitionAtPosition(fileName: string, position: number): readonly DefinitionInfo[] | undefined;
findReferences(fileName: string, position: number): ReferencedSymbol[] | undefined;
getApplicableRefactors(fileName: string, positionOrRange: number | TextRange, preferences?: UserPreferences): ApplicableRefactorInfo[];
// ... 100+ more methods
}type TransformerFactory<T extends Node> = (
context: TransformationContext
) => Transformer<T>;
type Transformer<T extends Node> = (node: T) => T;
interface TransformationContext {
factory: NodeFactory;
getCompilerOptions(): CompilerOptions;
hoistFunctionDeclaration(node: FunctionDeclaration): void;
hoistVariableDeclaration(node: Identifier): void;
requestEmitHelper(helper: EmitHelper): void;
enableSubstitution(kind: SyntaxKind): void;
enableEmitNotification(kind: SyntaxKind): void;
}
function transform<T extends Node>(
source: T | T[],
transformers: TransformerFactory<T>[],
compilerOptions?: CompilerOptions
): TransformationResult<T>;SyntaxKind (359 values) - All AST node typesTypeFlags - Type classification flagsSymbolFlags - Symbol classification flagsScriptTarget - JavaScript target versionsModuleKind - Module system typesModuleResolutionKind - Module resolution strategiesDiagnosticCategory - Error, Warning, Suggestion, MessageNodeFlags - Node metadata flagsTypeScript v5.9.3 includes:
For specific tasks: