相信大家都知道什麼是 TypeScript ,而 TypeScript Compiler API 就是 TypeScript 它們自己在編譯時所使用的 API ,透過使用它可以更便利、直觀地透過程式來掃描、解析我們用 TypeScript 所撰寫的程式碼。
使用的方式非常簡單,只要專案內有用到 TypeScript 的話,可以像這樣直接引入並使用:
import * as ts from 'typescript';
注意: TypeScript 的版本要在
1.6
版以上方可使用,目前最新的版本是3.6.3
。
先來個起手式暖暖身:
ts.createSourceFile(
'test.ts',
`const name = 'Leo';`,
ts.ScriptTarget.ES2015,
true,
ts.ScriptKind.TS
);
createSourceFile
這個函式的功能是用來建立檔案,是在使用 TypeScript Compiler API
時,百分之百一定會使用到的函式。
它有五個參數:
fileName: string
- 檔案名稱。sourceText: string
- 檔案內容。languageVersion: ScriptTarget
- 語言版本。setParentNodes?: boolean
- 是否要為每個節點設置 parentNode
(父節點)這個屬性,預設為 false
。scriptKind?: ScriptKind
- 檔案類型,如為 .ts
檔可不給。AST( Abstract Syntax Tree ,抽象語法樹) 是一個大型的樹狀結構 ,它的結構其實跟 DOM 很像,如下圖所示:
之所以說它們很像,是因為它們都是由一個個的節點 ( Node ) 所組成,差別只在於各自節點的資料內容與資料結構不同罷了。
以下是 AST 節點幾個比較重要的屬性:
ts.createSourceFile
時沒有傳入第四個參數或是該參數給 false
時,此欄位不會有資料)。NodeFlags
這個列舉裡(總共 27 種)。拿起手式的例子來說,結構大致會長得像是下圖這樣:
SourceFile
是整個 AST 的根節點,無論檔案內有沒有內容,一定會有它。VariableStatement
表示在這個檔案中,有一個宣告變數的節點,這個節點基本上就代表著 const name = 'Leo';
這一行。VariableDeclarationList
這個節點代表 const name = 'Leo'
。VariableDeclaration
這個節點代表 name = 'Leo'
。name
是 Identifier
、 'Leo'
是 StringLiteral
。EndOfFileToken
,是整個 AST 中最末梢的節點,無論檔案內有沒有內容,一定會有它。如果文字敘述有點讓你暈頭轉向的話,筆者換個比較清楚一點的方式表達:
轉眼就來到了第十天,寫鐵人賽就是這麼的樸實無華且枯燥。
今天主要是先跟大家說明 TypeScript AST 與 Compiler API 的基礎原理,雖然沒有程式碼較令人感到枯燥乏味,但一切都是為了明天的應用所鋪路。
明天將會分享如何使用 TypeScript Compiler API 來修改現有檔案內的程式碼,敬請期待!