Dart - 类型定义

在 Dart 语言中,函数与 String 和 Number 一样都是对象,可以使用 类型定义(或者叫 方法类型别名)来为函数的类型命名。使用函数命名将该函数类型的函数赋值给一个变量时,类型定义将会保留相关的类型信息。

比如下面的代码没有使用类型定义:

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);
}

上述代码中,当将参数 f 赋值给 compare 时,函数的类型信息丢失了,这里 f 这个函数的类型为 (Object, Object) → int(→ 代表返回),当然该类型也是一个 Function 的子类,但是将 f 赋值给 compare 后,f 的类型 (Object, Object) → int 就会丢失。我们可以使用 typedef 显式地保留类型信息:

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 Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // True!
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 时间:2018年5月9日到13日 第一天: 入住亿成阳光酒店,费用300元一个标准间包早餐,可两人一起,也可以自己...
    千澄迎春阅读 3,945评论 0 0
  • 在遥远的十五年前,我有一个朋友叫小武。他大约二十来岁,比我将将大一轮。按照爸妈说的,我应该喊他武哥,但我却一直没大...
    陈乡阅读 5,595评论 0 6
  • 发现在有孩子的情况下坚持写东西是很挑战的,昨天小朋友放假了,所以我就完全忘记这个日更什么的,一整天围着她转...
    要佛不要火阅读 1,859评论 0 1