Dart:类型定义typedef

  1. 什么是 typedef
  2. 函数类型别名(最常见)
  3. 类/泛型别名(Dart 2.13+)
  4. 函数参数中使用 typedef
  5. typedef 的限制和注意点

什么是 typedef

typedef(type definition 的缩写)在 Dart 里有两个主要作用:

  1. 给类型起别名(让类型名更短、更可读)
  2. 定义函数类型别名(给某种函数签名命名)

函数类型别名(最常见)

有时候我们想把“参数类型 + 返回值类型”的一组函数签名打包成一个名字,方便复用。

typedef IntToString = String Function(int);

String numberToString(int n) => '数字: $n';

void main() {
  IntToString func = numberToString;
  print(func(42)); // 数字: 42
}
  • typedef IntToString = String Function(int);:表示 任何接收一个 int、返回 String 的函数 都符合这个类型。
  • 声明变量 func 时就能直接用 IntToString 而不用写长串类型。

类/泛型别名(Dart 2.13+)

Dart 2.13 开始,typedef 也可以给 类类型 起别名,尤其是泛型类。

class MyMap<K, V> {
  final Map<K, V> _map = {};
}

typedef StrIntMap = MyMap<String, int>;

void main() {
  StrIntMap map = StrIntMap(); // 相当于 MyMap<String, int>()
}

函数参数中使用 typedef

typedef Filter = bool Function(String);

void processList(List<String> items, Filter filter) {
  for (var item in items) {
    if (filter(item)) {
      print('保留: $item');
    }
  }
}

void main() {
  processList(['apple', 'banana', 'pear'], (item) => item.startsWith('a'));
}

这样 processList 的签名更清晰,filter 参数的类型描述不用重复写。

typedef 的限制和注意点

  1. 不会创建新类型
    Typedef 只是别名,不是新类型,运行时仍是原类型。

    typedef MyInt = int;
    void main() {
      int a = 5;
      MyInt b = a; // OK,本质上还是 int
    }
    
  2. 可与泛型一起用

    typedef Mapper<T> = T Function(T);
    
  3. Flutter 回调常用 typedef
    Flutter 里很多 Widget 回调类型都是用 typedef 定义的,比如:

    typedef VoidCallback = void Function();
    

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com

×

喜欢就点赞,疼爱就打赏