TypeScript 命名空間 (Namespaces)
⚠️ 遺跡警告
namespace是 TypeScript 早期的功能(當時叫 "Internal Modules")。 在現代開發中 (ES6+),請優先使用 ES Modules (import/export)。你只需要在以下兩種情況了解
namespace:
- 你在維護一個非常舊的 TypeScript 專案。
- 你在寫
.d.ts定義檔,需要描述一個舊的 JavaScript 函式庫 (如 jQuery)。
什麼是 Namespace?
在 ES Modules 出現之前,JavaScript 沒有模組系統。大家都是直接在全域物件 window 上掛東西。為了避免變數名稱打架,我們習慣用一個大物件包起來:
var MyLibrary = {
add: function (a, b) {
return a + b;
},
sub: function (a, b) {
return a - b;
},
};
TypeScript 的 namespace 就是為了模擬這種模式設計的。
namespace MathUtil {
export function add(a: number, b: number) {
return a + b;
}
}
// 使用
MathUtil.add(1, 2);
為什麼現在不推薦了?
- 無法 Tree-shaking:因為它是直接掛在一個物件上,打包工具很難移除沒用到的部分,導致 bundle size 變大。
- 依賴關係不透明:不像
import一眼就能看出這支檔案依賴了誰。 - 容易造成全域污染:如果不小心,它可以跨檔案合併,讓追蹤程式碼變得很困難。
現代替代方案
用 ES Modules 解決一切:
// math.ts
export function add(a: number, b: number) {
return a + b;
}
// app.ts
import { add } from './math';
簡單、標準、又乾淨。