TypeScript 5.7 引入了多個新特性和改進,旨在提升開發者體驗,并確保代碼的可靠性和高效性。此版本重點優化了變量初始化檢查、模塊導入處理、與 ECMAScript 標準的兼容性等方面。以下是這些更新的詳細介紹
增強的變量初始化檢查
TypeScript 5.7 改進了對未初始化變量的處理。在之前的版本中,如果變量在嵌套函數中被訪問,TypeScript 并不會捕獲錯誤。
在舊版本中,以下代碼不會報錯:
function example() {
let result: number;
if (someCondition()) {
result = computeValue();
} else {
// 忘記給 'result' 賦值
}
function displayResult() {
console.log(result); // 此處沒有錯誤
}
}
現在,TypeScript 會捕獲錯誤,即使變量在嵌套函數中被訪問:function example() {
let result: number;
function displayResult() {
console.log(result); // 錯誤:變量 'result' 在被賦值之前就被使用。
}
}
此改進確保您的代碼更加健壯,減少了潛在的運行時錯誤。
相對導入路徑重寫
隨著 ts-node、Deno 等工具的流行,開發者常常直接導入 .ts 文件。TypeScript 5.7 引入了新的 --rewriteRelativeImportExtensions 編譯選項,以簡化這一過程。
在 TypeScript 5.7 之前,當開發者在開發過程中使用 .ts 文件時,編譯成 JavaScript 后,往往會出現路徑不匹配的問題:
import { helper } from "./helper.ts"; // 開發環境中直接導入 TypeScript 文件
啟用此選項后,TypeScript 會在編譯過程中自動將 .ts 文件路徑重寫為 .js 文件路徑,避免開發與生產環境間的路徑不一致:
// 輸入(啟用 --rewriteRelativeImportExtensions)
import { helper } from "./helper.ts";
// 輸出(編譯后)
import { helper } from "./helper.js";
支持 ECMAScript 2024 新特性
TypeScript 5.7 支持 ECMAScript 2024 的新特性,允許開發者利用最新的 JavaScript 功能。
Object.groupBy 和 Map.groupBy 方法,簡化對象和 Map 條目的分組。
Promise.withResolvers 提供更好的 promise 控制。
Atomics.waitAsync 從 ES2022 庫移至 ES2024。
TypedArrays 現在是對 ArrayBufferLike 的泛型,使其可以與 ArrayBuffer 和 SharedArrayBuffer 一起使用。
示例:
interface Uint8Array<TArrayBuffer extends ArrayBufferLike = ArrayBufferLike> {
// TypedArray 方法和屬性
}
通過這些特性,TypeScript 開發者可以更輕松地使用最新的 JavaScript 功能,而無需擔心兼容性問題。
優化的項目配置解析
TypeScript 5.7 改進了編輯器(如 Visual Studio Code)如何解析項目配置文件(tsconfig.json)。這一更新確保編輯器可以正確解析項目中多個配置文件。
之前,TypeScript 在打開文件時會在目錄層次結構中找到第一個 tsconfig.json 文件后停止搜索,這可能導致錯誤的項目關聯。
現在,TypeScript 會繼續在目錄樹中向上查找,確保找到正確的配置文件。例如:
project/
├── src/
│ ├── app.ts
│ ├── app.test.ts
│ ├── tsconfig.json // 排除測試文件
│ └── tsconfig.test.json // 包含測試文件
└── tsconfig.json // 引用 src 配置
在 TypeScript 5.7 中,當打開 app.test.ts 時,它會正確關聯到 src/tsconfig.test.json。
使用 --module nodenext 進行 JSON 導入驗證
TypeScript 5.7 對使用 --module nodenext 選項導入 JSON 文件進行了更嚴格的驗證,確保與 Node.js 的 ES 模塊標準一致。
import config from "./config.json" assert { type: "json" };
這樣可以確保 TypeScript 與 Node.js ES 模塊行為一致,避免運行時錯誤。
支持 V8 編譯緩存
TypeScript 5.7 利用 Node.js 22 中的新 module.enableCompileCache() API 來提升 TypeScript 工具的啟動性能。
沒有緩存時:
node ./built/local/_tsc.js --version
# 時間: ~122ms
啟用緩存后:
node ./built/local/tsc.js --version
# 時間: ~48ms
這個新特性特別適用于大型項目,可以顯著加快開發流程。
顯著的行為變化
TypeScript 5.7 引入了一些可能影響現有代碼庫的變化,開發者需要注意以下幾點:
TypedArrays 現在是泛型:需要更新代碼以支持泛型參數。
非字面量方法名的索引簽名:TypeScript 現在會為使用動態鍵(如符號)的類方法生成索引簽名。
返回 null 或 undefined 的函數的隱式 any 錯誤:TypeScript 會報告函數返回 null 或 undefined 時的隱式 any 錯誤,改進了類型檢查。
示例:
declare var promise: Promise<number>;
const result = promise.catch(() => null); // 錯誤:函數隱式返回了 'any' 類型
結論
TypeScript 5.7 帶來了許多令人興奮的新特性和改進,幫助開發者編寫更可靠、高效的代碼。通過新的檢查、更好的 ECMAScript 兼容性和性能優化,TypeScript 進一步提升了開發體驗。開發者應當探索這些新特性,并根據需求調整代碼,以充分利用此次發布的改進。
本文首發于公眾號“web前端開發之旅”,轉載請注明出處!
該文章在 2025/2/11 16:15:15 編輯過