Во время работы над модулем для взаимодействия с базой данных через Drift возникла необходимость часто повторять одни и те же типы функций — особенно когда речь шла о фильтрации и сортировке таблиц. Чтобы не тянуть за собой длинные сигнатуры, затаскивать библиотеку и не усложнять код, я решила использовать typedef.
Что такое typedef?
Typedef позволяет дать имя какому-то типу. Это особенно удобно, когда тип громоздкий, например, функция с дженериками, списки функций или колбэки. Сложный тип описывается один раз и дальше используется по имени — лаконично и понятно.
Пример
При работе с БД часто встречаются такие сигнатуры:
Expression<bool> Function(MyTable tbl)
List<OrderingTerm Function(MyTable tbl)>
Чтобы не затаскивать drift в каждый файл и гадать, что за конструкция используется, были созданы именованные типы:
// Вынесенная фильтрация
typedef FilterExpression<Q extends BaseTable> = Expression<bool> Function(Q tbl);
// Вынесенный список для сортировки
typedef OrderByExpressions<Q extends BaseTable> = List<OrderingTerm Function(Q tbl)>;
Как использовать?
Вместо длинных сигнатур теперь в универсальных функциях можно использовать понятные имена:
Future<List<T>> fetchFilteredData<T extends BaseTable>({
required FilterExpression<T> where,
OrderByExpressions<T>? orderBy,
}) async {}Гораздо чище и легче воспринимается при чтении и навигации по коду.
Вывод
Typedef — небольшой, но полезный инструмент, который помогает писать аккуратный и поддерживаемый код. Особенно полезен при работе с абстракциями, как в случае с Drift, или при проектировании универсальных репозиториев.
