TypeScript 命名空間 (Namespaces)

⚠️ 遺跡警告

namespace 是 TypeScript 早期的功能(當時叫 "Internal Modules")。 在現代開發中 (ES6+),請優先使用 ES Modules (import/export)

你只需要在以下兩種情況了解 namespace

  1. 你在維護一個非常舊的 TypeScript 專案。
  2. 你在寫 .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);

為什麼現在不推薦了?

  1. 無法 Tree-shaking:因為它是直接掛在一個物件上,打包工具很難移除沒用到的部分,導致 bundle size 變大。
  2. 依賴關係不透明:不像 import 一眼就能看出這支檔案依賴了誰。
  3. 容易造成全域污染:如果不小心,它可以跨檔案合併,讓追蹤程式碼變得很困難。

現代替代方案

用 ES Modules 解決一切:

// math.ts
export function add(a: number, b: number) {
  return a + b;
}

// app.ts
import { add } from './math';

簡單、標準、又乾淨。