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