Typedefs

优质
小牛编辑
133浏览
2023-12-01

在 Dart 中,函数是对象,就像字符串和数字是对象一样。一个 typedef,或者叫做”函数类型别名“,给函数类型起了一个名字,使你可以在定义字段和返回值类型时使用。在将一个函数类型赋值给一个变量时,一个 typedef 保留了类型信息。

考虑以下代码,不使用 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);
}

在将 f 赋值给 compare 时类型信息丢失了。f 的类型是 (Object, Object) → int(箭头的意思是返回),而 compare 的类型是 Function。如果我们修改一下代码,来使用明确的名字并且保留类型信息,开发者和工具都可以使用这个类型信息。

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

说明:目前,typedefs 仅可用于函数类型。我们预计这会有所改变。

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