在Dart中,函数是对象,就像字符串,数字是对象。 typedef或函数类型别名为函数类型提供了可以用来声明字段和返回类型的名称。 当函数类型分配给变量时,typedef会保留类型信息。
没用typedef的情形:
class SortedCollection {
Function compare;
SortedCollection(int f(Object a, Object b)) {
compare = f;
}
}
// Initial, broken implementation.
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
// All we know is that compare is a function,
// but what type of function?
assert(coll.compare is Function);
}
将f分配给比较时,类型信息会丢失。 f的类型是(Object,Object)→int(其中→表示返回),但比较的类型是Function。 如果我们将代码更改为使用显式名称并保留类型信息,则开发人员和工具都可以使用该信息。
typedef Compare = int Function(Object a, Object b);
class SortedCollection {
Compare compare;
SortedCollection(this.compare);
}
// Initial, broken implementation.
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
assert(coll.compare is Function);
assert(coll.compare is Compare);
}
因为typedef
只是别名,所以它们提供了一种检查任何函数类型的方法。 例如:
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!
}
网友评论