← Назад к вопросам

Что такое typedef в Dart?

1.0 Junior🔥 202 комментариев
#Dart#ООП и паттерны

Комментарии (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 — это инструмент для повышения читаемости и переиспользования кода. Правильное использование делает код более чистым и поддерживаемым.

Что такое typedef в Dart? | PrepBro