老實說,TypeScript 6 公布時我也差點直接跳過。大家都在等那個用 Go 重寫、號稱快很多的 7,誰會特別興奮一個負責清理舊設定的版本?但我真的開始看 migration 時,才發現 6 很像搬家前那個討厭卻不能省的整理日:不先丟掉這些東西,新家根本搬不進去。
官方把 TypeScript 6 定位成舊 JavaScript codebase 的最後一個版本,同時維持與 5.9 API 相容。這讓團隊可以先在熟悉的 compiler 上清理問題,再決定何時切到新的原生工具。
TypeScript 6 先清掉了什麼
-
target: es5被棄用: TypeScript 的最低方向往 ES2015 移動。若產品真的還要輸出 ES5,之後要交給其他編譯工具處理。 -
舊的 module 設定退場:
amd、umd、systemjs和none不再支援;舊的moduleResolution: node也應改成面向 Node 的nodenext,或給 bundler 使用的bundler。 -
interop 與 strict 行為收斂:
esModuleInterop、allowSyntheticDefaultImports不再能設為 false,程式也一律按 strict mode 看待。過去為相容舊環境留下的分岔逐漸被收掉。 -
outFile移除: 合併輸出早已有 Vite、Rollup、esbuild 等 bundler 處理,TypeScript 更專注在型別檢查與 declaration emit。
TypeScript 6 可以暫時用 ignoreDeprecations: "6.0" 壓住部分警告,但 TypeScript 7 會直接移除這些選項。這個設定比較像緩衝,不是長期解法。
到了 TypeScript 7,還要注意周邊工具
TypeScript 7 改用 Go 的原生 compiler 和 language server,官方公布的完整 build 常見改善約為 8 到 12 倍。不過 7.0 還沒有穩定的 programmatic API,因此 Vue、Svelte、Astro、MDX、Angular,以及 typescript-eslint 這類會把 TypeScript 嵌進自己工具的生態,未必能立刻完整切換。
官方提供 @typescript/typescript6 相容套件,讓專案在過渡期保留舊 API。也就是說,有些團隊可能先用 TypeScript 7 的 CLI 做全專案檢查,編輯器或 framework tooling 暫時仍留在 6;這不是升級失敗,而是原生移植規模太大,需要一段交接期。
我的看法
我會把 TypeScript 6 當成搬家前整理雜物,而不是一版無聊的過場。先讓專案在 6 上不靠 ignoreDeprecations 也能乾淨編譯,再確認 editor、lint 和 framework plugin 對 7 的支援,會比只看官方速度數字就直接升級安心很多。
實務上我會先把 TypeScript 版本和 @types/* 更新拆開。兩邊一起升,突然多出一百個錯誤時很難判斷是 compiler 行為、lib 定義,還是 framework 型別改變。先建立一個零警告的 6.x 基準,再讓原生 CLI 進 CI 做不擋合併的檢查,會是一條比較舒服的過渡路線。