在 Dart 中,函數(shù)也是對象,就想字符和數(shù)字對象一樣。 使用 typedef ,或者 function-type alias 為函數(shù)起一個別名, 別名可以用來聲明字段及返回值類型。 當函數(shù)類型分配給變量時,typedef會記錄類型信息。
請考慮以下代碼,代碼中未使用 typedef :
class SortedCollection {
Function compare;
SortedCollection(int f(Object a, Object b)) {
compare = f;
}
}
// Initial, broken implementation. // broken ?
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
// 雖然知道 compare 是函數(shù),
// 但是函數(shù)是什么類型 ?
assert(coll.compare is Function);
}
當把 f 賦值給 compare 的時候,類型信息丟失了。 f 的類型是 (Object, Object) → int (這里 → 代表返回值類型), 但是 compare 得到的類型是 Function 。如果我們使用顯式的名字并保留類型信息, 這樣開發(fā)者和工具都可以使用這些信息:
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;
main() {
SortedCollection coll = SortedCollection(sort);
assert(coll.compare is Function);
assert(coll.compare is Compare);
}
提示: 目前,typedefs 只能使用在函數(shù)類型上, 我們希望將來這種情況有所改變。
由于 typedefs 只是別名, 他們還提供了一種方式來判斷任意函數(shù)的類型。例如:
typedef int Compare(int a, int b);
int sort(int a, int b) => a - b;
main() {
assert(sort is Compare); // True!
}
更多建議: