TypeScript 7.0 發佈說明:原生移植與效能提升
TypeScript 7.0 發佈說明:原生移植與效能提升
TypeScript 7.0 透過原生 Go 移植實現數量級的速度提升
TypeScript 7.0 是使用 Go 語言建構的 TypeScript 編譯器原生移植版本,旨在最大化現代硬體的利用率。透過實作共享記憶體多執行緒技術與原生程式碼優化,TypeScript 7.0 在完整建置時的速度通常比 TypeScript 6.0 快 8 到 12 倍,同時降低了總體記憶體消耗。
效能基準測試
在大型開源程式碼庫上的實際測試顯示,建置時間與記憶體使用量均顯著減少:
| Codebase | TS 6 Build Time | TS 7 Build Time | Speedup | Memory Delta |
|---|---|---|---|---|
| vscode | 125.7s | 10.6s | 11.9x | -18% |
| sentry | 139.8s | 15.7s | 8.9x | -6% |
| bluesky | 24.3s | 2.8s | 8.7x | -26% |
| playwright | 12.8s | 1.47s | 8.7x | -11% |
| tldraw | 11.2s | 1.46s | 7.7x | -15% |
除了完整建置之外,編輯器體驗也同樣獲得了加速。例如,在 VS Code 程式碼庫中開啟檔案時,看到第一個錯誤所需的時間從 TypeScript 6 的 17.5 秒降至 TypeScript 7 的 1.3 秒以下。
並行化與縮放控制
TypeScript 7.0 將解析 (parsing)、型別檢查 (type-checking) 與發射 (emitting) 進行了並行化處理。為了針對特定硬體或 CI 環境優化效能,此版本引入了幾個新旗標 (flags):
--checkers: 控制型別檢查器工作執行緒 (workers) 的數量 (預設為 4)。增加此值可以提高高核心數機器上的速度,但會增加記憶體使用量。將其減少至 1 可以消除資源受限環境中的重複工作。--builders: 控制在--build操作期間使用的並行專案引用建置器 (project reference builders) 數量,這對 monorepos 特別有益。--singleThreaded: 禁用所有並行化,將工作執行緒限制為 1,並強制解析與發射進入單一執行緒。這主要用於除錯或極度受限的環境。
重建的 Watch Mode
--watch 模式已使用 Parcel bundler 的 file-watcher 的 Go 移植版本完全重建。此替換消除了對 C++ 工具鏈的需求,同時提供了高效、穩定且跨平台的檔案監控功能。此更新帶來了顯著的資源改善與不同作業系統間更高的穩定性。
與 TypeScript 6.0 的相容性與遷移
TypeScript 7.0 與 TypeScript 6.0 的型別檢查與 CLI 行為相容,但它採用了 6.0 的預設值,並將幾個 6.0 的棄用項目轉化為強制錯誤 (hard errors)。
設定變更 (Breaking Configuration Changes)
7.0 中的幾個預設值已更改:
strict現在預設為true。module預設為esnext。stableTypeOrdering預設為true且無法禁用。rootDir現在預設為./,需要為內部原始碼目錄進行明確設定。types現在預設為[](先前為["*"])。
不支援的特性
以下項目不再受支援,並將觸發強制錯誤:
target: es5與downlevelIteration。moduleResolution: node/node10與moduleResolution: classic。module: amd, umd, systemjs, none。baseUrl(使用者應將paths更新為相對於專案根目錄的相對路徑)。- 將
esModuleInterop或allowSyntheticDefaultImports設定為false。 - 將
alwaysStricttofalse。
並行安裝 (Side-by-Side Installation)
由於 TypeScript 7.0 尚未提供穩定的程式化 API (預期在 7.1 版本中提供),因此它可以與 6.0 並行運行,例如用於 typescript-eslint 等工具。使用者可以透過以下方式安裝 6.0 相容性套件:
npm install -D typescript@npm:@typescript/typescript6
若要同時使用兩個版本,建議使用以下 package.json 配置:
{
"devDependencies": {
"@typescript/native": "npm:typescript@^7.0.2",
"typescript": "npm:@typescript/typescript6@^6.0.2"
}
}
語言與 JavaScript 更新
Template Literal Types 中的 Unicode
TypeScript 7.0 現在在 Template Literal Types 的推斷過程中保留了 Unicode 字元碼點 (code points)。它將代理對 (surrogate pairs,例如表情符號) 將視為單一單位,這與 for...of 迴圈與陣列展開 (array spreading) 的行為一致,而非遵循 JavaScript 的 UTF-16 編碼索引。
一致的 JavaScript 分析
JavaScript 支援已被重新設計,以更貼近 TypeScript 的分析方式。關鍵變更包括:
- 值 (values) 不能在預期型別的地方使用;必須使用
typeof。 @enum不再被特別識別;應改用用@typedef。- 獨立的
?不再是有效的型別;請使用any。 @class不再使函數成為建構函式 (constructor)。- 閉包風格的函數語法 (例如:
function(string): void) 不再受支援。
編輯器支援與生態系限制
TypeScript 7.0 利用了 Language Server Protocol (LSP) 與多執行緒技術來提升編輯器回應速度。VS Code 使用者可以透過專用擴充功能來使用這些改進,而 Visual Studio 會根據工作區 (workspace) 自動啟用它。
關於嵌入式語言的說明: 使用 Vue, MDX, Astro, Svelte, 與 Angular 模板的流程目前尚無法利用 TypeScript 7.0,因為它們依賴於尚未穩定的程式化 API。這些工具必須繼續使用 TypeScript 6.0,直到 API 在 7.1 版本中發佈。