Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Typedef в Dart — создание псевдонима для типа
Typedef — это способ создать альтернативное имя для существующего типа в Dart. Это особенно полезно для функциональных типов, обобщений (generics) и сложных структур данных.
Основная идея
Typedef позволяет:
- Упростить сложные типы — вместо повторения длинных сигнатур
- Улучшить читаемость кода — дать понятное имя типу
- Переиспользовать типы — определить один раз, использовать везде
- Работать с функциональными типами — создавать псевдонимы для колбэков
Typedef для функций
// Определяем typedef для функции с двумя int параметрами, возвращающей int
typedef IntOperation = int Function(int a, int b);
// Используем его
IntOperation add = (a, b) => a + b;
IntOperation multiply = (a, b) => a * b;
print(add(5, 3)); // Output: 8
print(multiply(5, 3)); // Output: 15
Typedef с параметрами типа (Generics)
// Typedef для функции, которая преобразует T в U
typedef Transformer<T, U> = U Function(T input);
// Используем
int stringLength(String s) => s.length;
final transform = stringLength as Transformer<String, int>;
print(transform('Hello')); // Output: 5
Практические примеры
Обработчик для Future:
typedef AsyncCallback<T> = Future<T> Function();
final Future<String> fetchUser = (() async {
return 'John Doe';
}) as AsyncCallback<String>;
API Response handler:
typedef ApiCallback<T> = void Function(T data, String? error);
void handleResponse(ApiCallback<String> callback) {
// Успешный результат
callback('data', null);
// Или ошибка
callback(null, 'Server error');
}
Event listener:
typedef EventListener<T> = void Function(T event);
class EventEmitter<T> {
final List<EventListener<T>> _listeners = [];
void subscribe(EventListener<T> listener) {
_listeners.add(listener);
}
void emit(T event) {
for (final listener in _listeners) {
listener(event);
}
}
}
Typedef для сложных типов (не функции)
// Typedef для Map
typedef UserMap = Map<String, dynamic>;
// Typedef для List
typedef UserList = List<Map<String, dynamic>>;
class UserRepository {
Future<UserMap> getUser(String id) async {
return {'id': id, 'name': 'John'};
}
Future<UserList> getAllUsers() async {
return [
{'id': '1', 'name': 'John'},
{'id': '2', 'name': 'Jane'},
];
}
}
Typedef с Flutter callbacks
typedef OnItemSelected<T> = void Function(T item);
typedef OnLoadMore = Future<void> Function();
class ListWidget<T> extends StatelessWidget {
final List<T> items;
final OnItemSelected<T> onItemSelected;
final OnLoadMore onLoadMore;
const ListWidget({
required this.items,
required this.onItemSelected,
required this.onLoadMore,
});
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () => onItemSelected(items[index]),
child: Text('Item $index'),
);
},
);
}
}
Когда использовать typedef
- Сложные функциональные типы — вместо повторения сигнатур
- Параметры типов (Generics) — для повышения читаемости
- Колбэки в Flutter — для четкого определения контрактов
- API responses — для типизации JSON структур
Typedef — это инструмент для повышения читаемости и переиспользования кода. Правильное использование делает код более чистым и поддерживаемым.