什么是 typedef
typedef
(type definition 的缩写)在 Dart 里有两个主要作用:
- 给类型起别名(让类型名更短、更可读)
- 定义函数类型别名(给某种函数签名命名)
函数类型别名(最常见)
有时候我们想把“参数类型 + 返回值类型”的一组函数签名打包成一个名字,方便复用。
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 的限制和注意点
不会创建新类型
Typedef 只是别名,不是新类型,运行时仍是原类型。typedef MyInt = int; void main() { int a = 5; MyInt b = a; // OK,本质上还是 int }
可与泛型一起用
typedef Mapper<T> = T Function(T);
Flutter 回调常用 typedef
Flutter 里很多 Widget 回调类型都是用 typedef 定义的,比如:typedef VoidCallback = void Function();
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com