typedef(型別別名)

定義

用途:typedef 用於替現有型別建立簡短別名,又稱型別別名。Dart 2.13 版本起完整支援所有型別,舊版僅能使用於函數型別。

語法:typedef 別名 = 原始型別;

範例:typedef IntList = List<int>;,宣告後可直接以 IntList 取代 List<int>

typedef IntList = List<int>;
IntList il = [1, 2, 3];Code language: Dart (dart)

支援泛型參數

型別別名可攜帶泛型,簡化複雜的複合型別:

typedef ListMapper<X> = Map<X, List<X>>;Code language: Dart (dart)

ListMapper<String> 等同於 Map<String, List<String>>,程式碼更簡潔易讀。

typedef ListMapper<X> = Map<X, List<X>>;
Map<String, List<String>> m1 = {}; // 冗長原生寫法
ListMapper<String> m2 = {}; // 功能相同,程式碼更簡短清晰Code language: Dart (dart)

函數型別別名

可針對函數簽名定義別名,統一規範函數格式:

typedef Compare<T> = int Function(T a, T b);Code language: Dart (dart)

只要符合 (T, T) → int 簽名的函數,都屬於 Compare<T> 型別,可透過 is 運算子判斷型別是否相符。

typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // 判斷結果為 true
}
Code language: Dart (dart)

實際範例

// 宣告型別別名
typedef IntList = List<int>;
typedef StringMap = Map<String, dynamic>;

void main() {
  // 直接使用別名宣告變數
  IntList nums = [10, 20, 30];
  StringMap info = {"name": "dart", "version": "2.18"};

  print(nums);
  print(info);
}Code language: JavaScript (javascript)
// 泛型別名:鍵值為X,值為X型別陣列
typedef ListMapper<X> = Map<X, List<X>>;

void main() {
  // 原生完整寫法
  Map<String, List<String>> oldData = {
    "fruit": ["apple", "banana"]
  };

  // 使用typedef簡寫,型別完全相等
  ListMapper<String> newData = {
    "fruit": ["apple", "banana"]
  };

  print(oldData);
  print(newData);
}Code language: Dart (dart)
// 泛型函數別名:接收兩個T型別參數,回傳整數
typedef Compare<T> = int Function(T a, T b);

// 符合 Compare<int> 簽名的函數
int intSort(int a, int b) => a - b;
// 符合 Compare<String> 簽名的函數
int strSort(String a, String b) => a.length - b.length;

void main() {
  // 執行階段型別檢查
  assert(intSort is Compare<int>);
  assert(strSort is Compare<String>);

  // 做為參數傳入使用
  List<int> arr = [5, 1, 3];
  arr.sort(intSort);
  print(arr); // 輸出:[1, 3, 5]
}Code language: Dart (dart)

typedef(型別別名)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *