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: es5downlevelIteration
  • moduleResolution: node/node10moduleResolution: classic
  • module: amd, umd, systemjs, none
  • baseUrl (使用者應將 paths 更新為相對於專案根目錄的相對路徑)。
  • esModuleInteropallowSyntheticDefaultImports 設定為 false
  • alwaysStrict to false

並行安裝 (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 版本中發佈。

Sources