TypeScript 的模組

TypeScript 的模組

本文將説明 TypeScript 中的模組。

YouTube Video

TypeScript 的模組

TypeScript 的模組是增強程式碼重用性和可維護性的關鍵功能。與 JavaScript 相似,TypeScript 也基於 ECMAScript 2015(ES6)的模組系統,但其主要特點在於能夠利用 TypeScript 的型別系統。

什麼是模組?

模組是一種將相關代碼分組到單一單元的系統,可以在其他文件中導入和重用。在 TypeScript 中,每個文件會創建一個作用域來封裝代碼,防止其影響其他文件。這有助於避免代碼衝突並使維護更容易。

內部模組與外部模組

  • 內部模組(命名空間):TypeScript 1.5 及更早版本中使用的一種模組定義方式,現在不推薦使用。現在被視為“命名空間”。
  • 外部模組:目前的標準,基於 ES6 模組系統。此部分主要說明外部模組。

如何導出模組

創建模組時,必須導出才能讓外部訪問。在 TypeScript 中,可以使用 export 關鍵字來導出變數、函數、類等。主要有兩種類型的導出方式。

具名導出

用於多個導出,允許導入端選擇並使用特定的項目。

 1// mathUtils.ts
 2export const pi: number = 3.14159;
 3
 4export function add(x: number, y: number): number {
 5    return x + y;
 6}
 7
 8export function subtract(x: number, y: number): number {
 9    return x - y;
10}

默認導出

用於希望整個模組只有一個默認導出的情況。默認導出沒有導出的名稱,允許導入端用任何名稱接收。

 1// calculator.ts
 2export default class Calculator {
 3    add(x: number, y: number): number {
 4        return x + y;
 5    }
 6
 7    subtract(x: number, y: number): number {
 8        return x - y;
 9    }
10}

如何匯入模組

要使用模組,可以使用 import 關鍵字從模組中匯入值、函式、類別等內容。

具名匯入

當從具名匯出中匯入特定元素時,使用大括號 {}

1// main.ts
2import { pi, add, subtract } from './mathUtils';
3
4console.log(`Value of pi: ${pi}`);
5console.log(`Addition: ${add(10, 5)}`);
6console.log(`Subtraction: ${subtract(10, 5)}`);

預設匯入

當匯入預設匯出時,可以使用任意名稱接收。

1// main.ts
2import Calculator from './calculator';
3
4const calculator = new Calculator();
5console.log(`Addition: ${calculator.add(10, 5)}`);
6console.log(`Subtraction: ${calculator.subtract(10, 5)}`);

匯入別名

為避免名稱衝突或縮短長名稱,可以使用別名進行匯入。

1// main.ts
2import { add as addition, subtract as subtraction } from './mathUtils';
3
4console.log(`Addition: ${addition(10, 5)}`);
5console.log(`Subtraction: ${subtraction(10, 5)}`);

模組與命名空間的差異

命名空間(namespace)是早期 TypeScript 用於組織程式碼的內部模組結構。然而,現在推薦使用 ES6 模組,命名空間已較少必要。

命名空間可以在同一檔案內或跨多個檔案定義,但由於它可全域展開,管理相依性可能會變得困難。相對之下,模組每個檔案都有獨立作用域且相依性明確,使其成為更現代且安全的方法。

 1// Example of a namespace
 2namespace Geometry {
 3    export function calculateArea(radius: number): number {
 4        return Math.PI * radius * radius;
 5    }
 6}
 7
 8// Can be used directly without importing the module (not recommended)
 9const area: number = Geometry.calculateArea(5);
10console.log(`Area: ${area}`);

TypeScript 模組解析

在 TypeScript 中,模組解析有兩種策略。

  • Node 模組解析:Node.js 環境中使用的標準解析方法,透過在 node_modules 資料夾中搜尋模組進行解析。
  • 經典模組解析:TypeScript 的自有解析方式,執行更具彈性的搜尋,但如今已不常使用。

通常使用 Node 模組解析,並在未於設定檔中特別指定時為預設啟用。

實例範例

最後,展示了一個使用模組實現並重複使用計算函式的範例。

mathUtils.ts

 1export const pi: number = 3.14159;
 2
 3export function multiply(x: number, y: number): number {
 4    return x * y;
 5}
 6
 7export function divide(x: number, y: number): number {
 8    if (y === 0) {
 9        throw new Error("Cannot divide by zero");
10    }
11    return x / y;
12}
  • 此檔案定義了數學實用函數,並提供可重複使用的基本算術運算。

calculator.ts

 1import { multiply, divide } from './mathUtils';
 2
 3export default class Calculator {
 4    multiplyNumbers(x: number, y: number): number {
 5        return multiply(x, y);
 6    }
 7
 8    divideNumbers(x: number, y: number): number {
 9        return divide(x, y);
10    }
11}
  • 此檔案定義並導出了 Calculator 類別。它使用從 mathUtils 匯入的函數,在內部封裝計算機功能。

main.ts

1import Calculator from './calculator';
2
3const calculator = new Calculator();
4
5const result1: number = calculator.multiplyNumbers(10, 5);
6console.log(`Multiplication: ${result1}`);
7
8const result2: number = calculator.divideNumbers(10, 2);
9console.log(`Division: ${result2}`);
  • 此檔案是應用程式的入口點。它建立一個 Calculator 類別的實例,執行乘法和除法,並將結果輸出到主控台。

總結

TypeScript 的模組系統是組織程式碼、提升重複使用性及增加可維護性的強大工具。推薦基於 ES6 模組的外部模組使用,並通過 exportimport 關鍵字輕鬆實現模組的匯出與匯入。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video