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 = {}; // Verbose.
ListMapper<String> m2 = {}; // Same thing but shorter and clearer.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,返回int
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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注