Typedefs
优质
小牛编辑
133浏览
2023-12-01
在 Dart 中,函数是对象,就像字符串和数字是对象一样。一个 typedef,或者叫做”函数类型别名“,给函数类型起了一个名字,使你可以在定义字段和返回值类型时使用。在将一个函数类型赋值给一个变量时,一个 typedef 保留了类型信息。
考虑以下代码,不使用 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);
}
在将 f 赋值给 compare 时类型信息丢失了。f 的类型是 (Object, Object) → int(箭头的意思是返回),而 compare 的类型是 Function。如果我们修改一下代码,来使用明确的名字并且保留类型信息,开发者和工具都可以使用这个类型信息。
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);
}
说明:目前,typedefs 仅可用于函数类型。我们预计这会有所改变。
因为 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!
}