在 Dart 語言中,函數(shù)與 String 和 Number 一樣都是對象,可以使用 類型定義(或者叫 方法類型別名)來為函數(shù)的類型命名。使用函數(shù)命名將該函數(shù)類型的函數(shù)賦值給一個變量時,類型定義將會保留相關(guān)的類型信息。
比如下面的代碼沒有使用類型定義:
class SortedCollection {
Function compare;
SortedCollection(int f(Object a, Object b)) {
compare = f;
}
}
// 簡單的不完整實現(xiàn)。
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
// 我們知道 compare 是一個函數(shù)類型的變量,但是具體是什么樣的函數(shù)卻不得而知。
assert(coll.compare is Function);
}
上述代碼中,當(dāng)將參數(shù) f 賦值給 compare 時,函數(shù)的類型信息丟失了,這里 f 這個函數(shù)的類型為 (Object, Object) → int(→ 代表返回),當(dāng)然該類型也是一個 Function 的子類,但是將 f 賦值給 compare 后,f 的類型 (Object, Object) → int 就會丟失。我們可以使用 typedef 顯式地保留類型信息:
typedef Compare = int Function(Object a, Object b);
class SortedCollection {
Compare compare;
SortedCollection(this.compare);
}
// 簡單的不完整實現(xiàn)。
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
assert(coll.compare is Function);
assert(coll.compare is Compare);
}
備忘??:目前類型定義只能用在函數(shù)類型上,但是將來可能會有變化。
因為類型定義只是別名,因此我們可以使用它判斷任意函數(shù)類型的方法:
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!
}