📋 目錄
TypeScript 6.0 不是一個普通的版本 — 它是 TypeScript 從 JavaScript 走向 Go 原生編譯器的最後一站。如果你正在評估要不要升級,這篇整理了所有你需要知道的變更,包含breaking changes、實際程式碼範例,以及升級檢查清單。
為什麼 TypeScript 6.0 值得注意
TypeScript 團隊正在將編譯器和語言服務從 JavaScript 重寫為 Go 語言版本,目标是利用原生效能與共享記憶體多執行緒。這個新編譯器將會是 TypeScript 7.0 的核心。
TypeScript 6.0 是兩個版本之間的橋樑。 大多數 6.0 的breaking changes 都是在為 7.0 的平行類型檢查做準備,確保你在升級 7.0 時不會被大量非預期的錯誤淹沒。
🚨 Breaking Changes:必須處理的變更
1. strict 模式成為預設值
從 TypeScript 6.0 開始,strict 模式(strictNullChecks、noImplicitAny、strictFunctionTypes 等)現在預設為開啟。
// tsconfig.json
{
"compilerOptions": {
// "strict": false ← 6.0 以前,現在隱含為 true
}
}
如果你本來就已經在 strict 模式下開發,恭喜:不受影響。
如果你的專案還沒開啟 strict,儘早遷移。建議用分段方式逐步開啟:
{
"compilerOptions": {
"strict": true,
"strictNullChecks": false // 先從最少的錯誤開始
}
}
每修正完一批錯誤,就打開一個 flag,最終抵達完整的 strict。
2. ES5 目標正式終結,最低版本提升至 ES2015
TypeScript 6.0 正式廢棄 --target ES5。如果你還在用 tsconfig.json 中的 "target": "ES5",編譯器現在會發出警告:
# TypeScript 6.0 編譯輸出
error TS5092: Option 'target: ES5' is deprecated.
Consider using 'ES2015' or higher.
這個改變反映了現代 JavaScript 環境的現實:
| 環境 | 最低支援 ES 版本 |
|---|---|
| Node.js | 20+ → ES2022+ |
| Chrome | 120+ → ES2023 |
| Safari | 17.4+ → ES2023 |
| Deno | 2.0+ → ES2022 |
如果你的產品需要支援 IE 11 或非常舊的手機瀏覽器,TypeScript 6.0 可能還需要额外工具鏈支援;但對於大多數專案來說,這是遲來的解脫。
3. --outFile 選項被移除
這個從 TypeScript 1.5 就存在的功能,在 6.0 正式走入歷史:
{
"compilerOptions": {
"outFile": "./dist/bundle.js" // ❌ TS5099: This option is no longer supported.
}
}
取代方案: 使用 esbuild、Rollup 或 Webpack 這類 bundler。它們提供更好的 tree-shaking、程式碼分割與效能。
4. --moduleResolution node(即 node10)被廢棄
這個從 2014 年就存在的模組解析策略(用於 CommonJS 專案)正式被標記為廢棄:
{
"compilerOptions": {
"moduleResolution": "node" // ❌ deprecated,請改用 bundler 或 nodenext
}
}
推薦遷移路徑:
// 選項 A:bundler(大多數情境推薦)
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "bundler"
}
}
// 選項 B:nodenext(Node.js 原生 ESM 專案)
{
"compilerOptions": {
"module": "nodenext",
"moduleResolution": "nodenext"
}
}
TypeScript 6.0 現在也允許 --moduleResolution bundler 搭配 --module commonjs 一起使用,這是常見的升級路徑組合。
5. Import Assert 語法完全廢棄
import ... assert 語法在 6.0 中被標記為廢棄:
// ❌ 廢棄
import data from "./data.json" assert { type: "json" };
// ✅ 新的 with 語法(Stage 4)
import data from "./data.json" with { type: "json" };
// ❌ import() 中的 assert 也廢棄
const data = await import("./data.json", { assert: { type: "json" } });
// ✅
const data = await import("./data.json", { with: { type: "json" } });
這項變更也呼應了 ECMAScript 規範的演進——with 語法是未來的標準。
✨ 新功能與實用改進
1. Subpath Imports 支援 #/ 開頭
Node.js 20+ 支援以 #/ 開頭的 subpath imports,TypeScript 6.0 現已完整支援(需搭配 node20、nodenext 或 bundler 的 moduleResolution):
// package.json
{
"name": "my-package",
"type": "module",
"imports": {
"#": "./dist/index.js",
"#/*": "./dist/*"
}
}
// 以前:必須多寫一個 segment
import { utils } from "#root/utils.js";
// 現在:更簡潔
import { utils } from "#/utils.js";
// 映射目錄
import { helpers } from "#/helpers/format.js";
適用的 moduleResolution 設定:
{
"compilerOptions": {
"moduleResolution": "bundler" // 或 node20 / nodenext
}
}
2. --stableTypeOrdering:為 TypeScript 7.0 做準備
TypeScript 7.0 會引入平行類型檢查(parallel type checking),大幅提升檢查速度。但平行化帶來一個副作用:類型 ID 的分配變成非確定性的。
這會造成宣告檔案輸出的順序不穩定:
// some-file.ts
export function foo(condition: boolean) {
return condition ? 100 : 500;
}
// some-file.d.ts(TS 6.0,輸出順序視 ID 而定)
export declare function foo(condition: boolean): 100 | 500;
// 或 500 | 100,取決於程式處理的先後順序
TypeScript 7.0 會強制使用穩定的排序演算法。 這是好消息,但 6.0 與 7.0 的輸出可能不一致。
如果你需要比對 6.0 和 7.0 的編譯輸出(例如 CI 比對),可以用新的 --stableTypeOrdering flag:
tsc --stableTypeOrdering
⚠️ 這個 flag 會讓類型檢查變慢約 25%,不建議當作長期選項使用,只用於診斷 6.0 與 7.0 的差異。
遇到使用 --stableTypeOrdering 後才出現的類型錯誤,通常表示你需要更明確的類型標註:
// 以前:依賴推論順序
someFunctionCall({ name: "test", value: 42 });
// 之後:加上明確類型
someFunctionCall<Config>({ name: "test", value: 42 });
3. this 不用就正常推論:方法語法終於完善
這是一個看似微小但影響深遠的修復。過去 TypeScript 對方法語法的類型推論有盲點:
declare function callIt<T>(obj: {
produce: (x: number) => T,
consume: (y: T) => void,
}): void;
// ✅ 箭頭函式:一直都能正常推論
callIt({
produce: (x: number) => x * 2,
consume: y => y.toFixed(), // y 被正確推論為 number
});
// ❌ 方法語法:過去會推論成 unknown
callIt({
consume(y) { return y.toFixed(); }, // 錯誤!y 被推論為 unknown
produce(x: number) { return x * 2; },
});
原因: TypeScript 過去將帶有隱含 this 的函式視為「上下文敏感」(contextually sensitive),降低它們在類型推論時的優先度。但既然這些方法根本沒用到 this,這個假設就浪費了推論機會。
TypeScript 6.0 聰明地偵測到方法如果沒用到 this,就不算是上下文敏感的,讓兩種語法現在行為一致。
4. es2025 目標與函式庫
TypeScript 6.0 新增了 --target es2025 和 --lib es2025 選項:
- 新增
RegExp.escape類型 - 移動
Promise.try、Iterator 方法、Set 方法至es2025(從esnext移入) - 符合 TC39 的正式規範位置
{
"compilerOptions": {
"target": "ES2025",
"lib": ["ES2025", "DOM"]
}
}
5. Temporal API 類型
困擾開發者多年的日期時間問題,終於有了更現代的標準解法。Temporal API 提案已達 Stage 3,TypeScript 6.0 現已內建類型:
import { Temporal } from "@js-temporal/polyfill";
// 新的 Temporal API 類型現在直接可用
const now = Temporal.Now.instant();
const today = Temporal.Now.plainDateTimeISO();
const birthday = Temporal.PlainDate.from({
year: 1990,
month: 5,
day: 15
});
const duration = Temporal.Duration.from({ hours: 2, minutes: 30 });
📋 升級檢查清單
對照你的專案,逐項確認:
# 1. 確認 TypeScript 版本
npm list typescript # 或 yarn list | grep typescript
# 2. 確認嚴格模式狀態
# 在 tsconfig.json 中搜尋 "strict"
# 如果還沒開啟,升級前先開啟
# 3. 檢查 target 設定
# 移除 "target": "ES5",改用 ES2015 或更高版本
# 4. 檢查 outFile 使用
# 如果有 "outFile",規劃遷移到 esbuild / Rollup / Webpack
# 5. 檢查 moduleResolution
# 將 "node" 改為 "bundler" 或 "nodenext"
# 6. 更新 import assert 語法
# 搜尋 " assert " 確保使用新的 with 語法
# 7. 測試編譯
npx tsc --noEmit
❓ 常見問題
Q1: TypeScript 6.0 一定要升級嗎?
不一定。如果你的專案不需要新功能,可以繼續使用 TypeScript 5.x。但未來要升級到 TypeScript 7.0(Go 編譯器版本),6.0 是必經的過渡階段,建議提早準備。
Q2: strict 模式預設開啟會影響現有專案嗎?
如果你的專案本來就有開啟 strict,不會有任何影響。如果還沒開啟,編譯時可能會出現較多錯誤,建議參考升級檢查清單逐步遷移。
Q3: outFile 被移除要用什麼取代?
建議使用現代 bundler 如 esbuild、Rollup 或 Webpack。它們提供更好的 tree-shaking、程式碼分割與開發體驗。
Q4: TypeScript 6.0 支援哪些瀏覽器?
從 6.0 開始,最低支援 ES2015 (ES6)。主流瀏覽器如 Chrome 120+、Firefox 120+、Safari 17.4+、Node.js 20+ 都完全支援。
Q5: 現在是升級 TypeScript 6.0 的好時機嗎?
如果是新專案,強烈建議直接使用 TypeScript 6.0。如果是既有專案,建議先在開發環境測試,確認相依套件相容後再升級生產環境。
總結:升級的藝術
TypeScript 6.0 是一個「橋樑版本」——大多數新功能不是用來炫耀的,而是用來確保你能順利過渡到 TypeScript 7.0 的原生 Go 編譯器。
最重要的三件事:
- 盡快開啟 strict 模式 — 這是遲早的事,6.0 已經預設了
- 放棄 ES5 目標 — 現代瀏覽器生態已經準備好了,你的工具鏈也該跟上
- 測試
--stableTypeOrdering— 如果你在 CI 中比對編譯輸出,現在是發現差異的最佳時機
# 一鍵升級(確認相容性之後)
npm install -D typescript@rc
延伸閱讀
- 2026 前端框架比較:React、Vue、Svelte 誰與爭鋒 — 了解主流前端框架在 TypeScript 支援上的表現
- 前端工程師部落格 SEO 寫作指南 — 如何將技術文章寫得更有搜尋能見度
本文章基於 TypeScript 6.0 RC 官方公告 整理,主題由編輯團隊選定。