В Dart функции являются объектами, так же как строки и числа являются объектами. 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);
}
Информация о типе теряется при назначении f
для compare
. Тип 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);
}
Примечание. В настоящее время
typedefs
ограничены типами функций. Мы ожидаем, что это изменится. Поскольку typedefs
являются просто псевдонимами, они предлагают способ проверки типа любой функции. Например:
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!
}