在Dart 中,函数跟 string 和 number 同样都是对象。类型定义或函数类型别名,为函数类型提供了一个名称,你能够在声明字段和返回类型的时候使用该名称。 当将函数类型分配给变量时,typedef
会保留类型的信息。函数
下面的代码没使用类型定义:工具
class SortedCollection {
Function compare;
SortedCollection(int f(Object a, Object b)) {
compare = f;
}
}
// 初始化,伪实现
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
// 咱们都知道 compare 是一个函数
// 那究竟是什么类型的函数?
assert(coll.compare is Function);
}
复制代码
在给compage
赋值f
时,类型的信息丢失了。 f
的类型是(Object, Object)->int(->表示返回)
, 然而compare
的是函数类型。 若是咱们将代码更改成使用显式名称并保留类型信息,那么开发人员和工具均可以使用该信息。ui
typedef Compare = int Function(Object a, Object b);
class SortedCollection {
Compare compare;
SortedCollection(this.compare);
}
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
assert(coll.compare is Function);
assert(coll.compare is Compare);
}
复制代码
由于typedef
只是简单的别名,因此它们提供了一种检查任何函数类型的方法。例如:this
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!
}
复制代码