TypeScript Compiler API 包含大量用于操作 AST(抽象語法樹)的方法和類型,完整列舉所有 API 較為龐大,但可以按照功能分類整理核心常用的 API,幫助你在編寫 Transformer 時快速參考:
一、節(jié)點類型判斷(ts.isXyz 系列)
用于判斷節(jié)點類型,返回 true 時會自動收窄節(jié)點類型(Type Narrowing)。
1. 基礎節(jié)點
ts.isNode(node):判斷是否為任意 AST 節(jié)點(最頂層類型)
ts.isSourceFile(node):是否為源文件節(jié)點(AST 根節(jié)點,代表整個 .ts 文件)
ts.isIdentifier(node):是否為標識符(變量名、函數(shù)名等,如 foo)
ts.isLiteral(node):是否為字面量(字符串、數(shù)字、布爾等)
ts.isStringLiteral(node):字符串字面量(如 "hello")
ts.isNumericLiteral(node):數(shù)字字面量(如 123)
ts.isBooleanLiteral(node):布爾字面量(如 true)
ts.isTemplateLiteral(node):模板字符串(如 `hi ${name}`)
2. 類與接口
ts.isClassDeclaration(node):類聲明(如 class A {})
ts.isInterfaceDeclaration(node):接口聲明(如 interface B {})
ts.isMethodDeclaration(node):類的方法(如 class A { fn() {} })
ts.isPropertyDeclaration(node):類的屬性(如 class A { prop: number })
ts.isConstructorDeclaration(node):類的構(gòu)造函數(shù)(如 constructor() {})
ts.isGetAccessor(node):getter 方法(如 get prop() {})
ts.isSetAccessor(node):setter 方法(如 set prop(val) {})
ts.isPropertyAccessExpression(node.expression) 被調(diào)用的是屬性訪問(如 console.log)
3. 函數(shù)與方法
ts.isFunctionDeclaration(node):函數(shù)聲明(如 function fn() {})
ts.isFunctionExpression(node):函數(shù)表達式(如 const fn = function() {})
ts.isArrowFunction(node):箭頭函數(shù)(如 const fn = () => {})
ts.isCallExpression(node):函數(shù)調(diào)用表達式(如 fn()、console.log())
ts.isNewExpression(node):構(gòu)造函數(shù)調(diào)用(如 new Cls())
ts.isParameter(node):函數(shù)參數(shù)(如 function fn(arg: number) {} 中的 arg)
4. 變量與賦值
ts.isVariableDeclaration(node):變量聲明(如 const a = 1 中的 a = 1)
ts.isVariableDeclarationList(node):變量聲明列表(如 const a = 1, b = 2)
ts.isAssignmentExpression(node):賦值表達式(如 a = b、obj.prop = 1)
ts.isBinaryExpression(node):二元表達式(如 a + b、a === b)
ts.isUnaryExpression(node):一元表達式(如 !a、-b、++i)
5. 語句與代碼塊
ts.isBlock(node):代碼塊(如 { ... })
ts.isExpressionStatement(node):表達式語句(如 console.log(1);)
ts.isIfStatement(node):if 語句(如 if (cond) {})
ts.isForStatement(node):for 循環(huán)(如 for (let i=0; i<10; i++) {})
ts.isForOfStatement(node):for...of 循環(huán)(如 for (const item of arr) {})
ts.isWhileStatement(node):while 循環(huán)(如 while (cond) {})
ts.isReturnStatement(node):return 語句(如 return 1;)
ts.isBreakStatement(node):break 語句
ts.isContinueStatement(node):continue 語句
6. 模塊與導入導出
ts.isImportDeclaration(node):import 聲明(如 import a from 'b')
ts.isExportDeclaration(node):export 聲明(如 export const a = 1)
ts.isExportDefaultDeclaration(node):默認導出(如 export default a)
ts.isImportSpecifier(node):命名導入(如 import { a } from 'b' 中的 a)
ts.isExportSpecifier(node):命名導出(如 export { a } 中的 a)
7. JSX 相關(guān)
ts.isJsxElement(node):JSX 元素(如 <div></div>)
ts.isJsxSelfClosingElement(node):自閉合 JSX 元素(如 <img />)
ts.isJsxAttribute(node):JSX 屬性(如 <div className="a"> 中的 className="a")
ts.isJsxExpression(node):JSX 中的表達式(如 <div>{name}</div> 中的 {name})
二、節(jié)點創(chuàng)建與更新(ts.factory 系列)
ts.factory 是創(chuàng)建和更新 AST 節(jié)點的核心工具,避免直接修改節(jié)點屬性(可能破壞 AST 結(jié)構(gòu))。
1. 基礎節(jié)點創(chuàng)建
ts.factory.createIdentifier(name):創(chuàng)建標識符(如 createIdentifier('foo') → foo)
ts.factory.createStringLiteral(value):創(chuàng)建字符串字面量(如 createStringLiteral('hi') → "hi")
ts.factory.createNumericLiteral(value):創(chuàng)建數(shù)字字面量(如 createNumericLiteral(123) → 123)
ts.factory.createBlock(statements, multiLine?):創(chuàng)建代碼塊(如 createBlock([...]) → { ... })
2. 函數(shù)與方法創(chuàng)建
ts.factory.createFunctionDeclaration(modifiers, name, ...):創(chuàng)建函數(shù)聲明
ts.factory.createArrowFunction(modifiers, params, body):創(chuàng)建箭頭函數(shù)
ts.factory.createMethodDeclaration(modifiers, name, ...):創(chuàng)建類的方法(TypeScript 4.8+ 合并了裝飾器到 modifiers)
ts.factory.createCallExpression(expression, args):創(chuàng)建函數(shù)調(diào)用(如 createCallExpression(consoleLog, []) → console.log())
3. 類與接口創(chuàng)建
ts.factory.createClassDeclaration(modifiers, name, ...):創(chuàng)建類聲明
ts.factory.createInterfaceDeclaration(modifiers, name, ...):創(chuàng)建接口聲明
ts.factory.createPropertyDeclaration(modifiers, name, ...):創(chuàng)建類的屬性
4. 變量與賦值創(chuàng)建
ts.factory.createVariableDeclaration(name, initializer):創(chuàng)建變量聲明(如 createVariableDeclaration('a', 1) → a = 1)
ts.factory.createVariableDeclarationList(declarations, flags):創(chuàng)建變量聲明列表(如 createVariableDeclarationList([...], ts.NodeFlags.Const) → const a = 1, b = 2)
ts.factory.createAssignmentExpression(left, right):創(chuàng)建賦值表達式(如 createAssignmentExpression(a, b) → a = b)
5. 節(jié)點更新(updateXyz)
ts.factory.updateFunctionDeclaration(node, ...):更新函數(shù)聲明
ts.factory.updateMethodDeclaration(node, ...):更新類的方法
ts.factory.updateClassDeclaration(node, ...):更新類聲明
ts.factory.updateCallExpression(node, ...):更新函數(shù)調(diào)用
ts.factory.updateIdentifier(node, newName):更新標識符名稱
三、遍歷與轉(zhuǎn)換(ts.visit 系列)
用于遍歷 AST 節(jié)點,是 Transformer 的核心邏輯載體。
ts.visitNode(node, visitor, test?):遍歷單個節(jié)點,調(diào)用 visitor 處理
ts.visitEachChild(node, visitor, context):遞歸遍歷節(jié)點的所有子節(jié)點
ts.createVisitor(visitNode, visitEachChild):創(chuàng)建自定義訪問器(高級用法)
四、上下文與程序(context 與 program)
context(轉(zhuǎn)換上下文):
context.factory:節(jié)點創(chuàng)建工具(ts.factory 的實例)
context.getCompilerOptions():獲取編譯配置(如 target、module)
context.hoistVariableDeclaration(identifier):提升變量聲明到作用域頂部
context.hoistFunctionDeclaration(node):提升函數(shù)聲明到作用域頂部
program(程序?qū)ο螅?/p>
program.getSourceFiles():獲取項目所有源文件
program.getTypeChecker():獲取類型檢查器(用于符號和類型分析)
program.getCompilerOptions():獲取項目編譯配置
program.getSourceFile(fileName):通過文件名獲取源文件
五、類型檢查器(typeChecker)
由 program.getTypeChecker() 獲取,用于分析節(jié)點的類型和符號。
typeChecker.getSymbolAtLocation(node):獲取節(jié)點對應的符號(Symbol)
typeChecker.getTypeAtLocation(node):獲取節(jié)點的類型
typeChecker.getExportsOfModule(symbol):獲取模塊的導出項
typeChecker.getSignatureFromDeclaration(node):獲取函數(shù) / 方法的簽名
六、工具函數(shù)
ts.getTextOfNode(node):獲取節(jié)點對應的源代碼字符串
ts.getLineAndCharacterOfPosition(sourceFile, position):獲取節(jié)點在源代碼中的行號和列號
ts.isKeyword(node, keyword):判斷標識符是否為關(guān)鍵字(如 ts.isKeyword(node, 'class'))
ts.factory.createUniqueName(prefix):創(chuàng)建唯一名稱(避免變量名沖突,如 createUniqueName('temp') → temp_1)
如何查詢完整 API?
TypeScript 官方文檔:Compiler API 文檔(基礎入門)。
TypeScript 源碼:核心 API 定義在 types.ts 和 factory.ts 中,可搜索關(guān)鍵字(如 function is 找判斷方法,function create 找創(chuàng)建方法)。
AST 可視化工具:使用 ts-ast-viewer.com,輸入代碼后查看節(jié)點類型,對應 API 可推導(如節(jié)點類型為 FunctionDeclaration,則判斷方法為 ts.isFunctionDeclaration,創(chuàng)建方法為 ts.factory.createFunctionDeclaration)。
IDE 智能提示:在 VS Code 中輸入 ts. 或 ts.factory. 會觸發(fā)自動補全,顯示所有可用 API 及參數(shù)說明。
通過上述分類,可覆蓋 Transformer 開發(fā)中 90% 以上的常用 API,具體場景可結(jié)合工具和源碼進一步查詢細節(jié)。
if (ts.isCallExpression(node)) {
? // 判斷是否是 console.log(...) 調(diào)用
? const isConsoleLogCall =
? ? ts.isPropertyAccessExpression(node.expression) &&? // 被調(diào)用的是屬性訪問(如 console.log)
? ? ts.isIdentifier(node.expression.expression) &&? ? // 屬性訪問的左側(cè)是標識符(console)
? ? node.expression.expression.text === 'console' &&? // 左側(cè)標識符是 console
? ? ts.isIdentifier(node.expression.name) &&? ? ? ? ? // 屬性名是標識符(log)
? ? node.expression.name.text === 'log';? ? ? ? ? ? ? // 屬性名是 log
? if (isConsoleLogCall) {
? ? console.log('攔截到 console.log 調(diào)用,參數(shù)為:', node.arguments);
? }
}