Dart基礎之類型定義(typedef)

在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!
}
複製代碼
相關文章
相關標籤/搜索