类型定义 (Typedefs)

2018-10-28  本文已影响0人  黑色的雨天

在Dart中,函数是对象,就像字符串和数字是对象一样。typedef或函数类型别名为函数类型提供一个名称,您可以在声明字段和返回类型时使用该名称。当将函数类型赋给变量时,typedef保留类型信息。

考虑以下代码,它不使用typedef:

class SortedCollection {
  Function compare;

  SortedCollection(int f(Object a, Object b)) {
    compare = f;
  }
}

// Initial, broken implementation.
int sort(Object a, Object b) => 0;

void main() {
  SortedCollection coll = SortedCollection(sort);

  // All we know is that compare is a function,
  // but what type of function?
  assert(coll.compare is Function);
}

当分配fcompare时类型信息丢失。f的类型是(Object, Object) → int(其中→表示返回),但compare的类型是Function。如果我们将代码更改为使用显式名称并保留类型信息,则开发人员和工具都可以使用该信息。

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;

void main() {
  SortedCollection coll = SortedCollection(sort);
  assert(coll.compare is Function);
  assert(coll.compare is Compare);
}

注意:目前typedef仅限于函数类型。我们希望这种情况能够改变。

因为typedef只是别名,所以它们提供了一种检查任何函数类型的方法。例如:

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!
}
上一篇下一篇

猜你喜欢

热点阅读