在Dart 中,函數跟 string 和 number 同樣都是對象。類型定義或函數類型別名,爲函數類型提供了一個名稱,你能夠在聲明字段和返回類型的時候使用該名稱。 當將函數類型分配給變量時,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);
}
複製代碼
在給compage
賦值f
時,類型的信息丟失了。 f
的類型是(Object, Object)->int(->表示返回)
, 然而compare
的是函數類型。 若是咱們將代碼更改成使用顯式名稱並保留類型信息,那麼開發人員和工具均可以使用該信息。ui
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);
}
複製代碼
由於typedef
只是簡單的別名,因此它們提供了一種檢查任何函數類型的方法。例如:this
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!
}
複製代碼