编程语言
961
在 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! }