Dart基础之类型定义(typedef)

3,910 阅读1分钟

在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的是函数类型。 如果我们将代码更改为使用显式名称并保留类型信息,那么开发人员和工具都可以使用该信息。

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只是简单的别名,所以它们提供了一种检查任何函数类型的方法。例如:

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!
}