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

Ответ

В Dart typedef (или псевдоним типа) — это способ дать имя сложному типу, чаще всего сигнатуре функции, чтобы упростить чтение и написание кода. Он не создаёт новый тип, а лишь предоставляет альтернативное имя для существующего.

Основное применение — упрощение сигнатур функций:

// Без typedef: громоздкий тип параметра
void processOperation(int Function(int, int) operation) {
  print(operation(5, 3));
}

// С typedef: код становится чище и понятнее
typedef IntOperation = int Function(int, int);

void processOperationClean(IntOperation operation) {
  print(operation(5, 3));
}

int add(int a, int b) => a + b;
int multiply(int a, int b) => a * b;

void main() {
  IntOperation myOperation = add;
  processOperationClean(myOperation); // 8

  myOperation = multiply;
  processOperationClean(myOperation); // 15
}

Также можно использовать для других типов:

// Псевдоним для сложного типа коллекции
typedef UserList = List<Map<String, dynamic>>;

UserList fetchUsers() {
  return [
    {'id': 1, 'name': 'Alice'},
    {'id': 2, 'name': 'Bob'},
  ];
}

Важные особенности:

  • Начиная с Dart 2.13, typedef поддерживает дженерики: typedef Mapper<T> = T Function(String);
  • Это инструмент времени компиляции, он не влияет на проверку типов во время выполнения.
  • Основная польза — улучшение читаемости кода и упрощение рефакторинга.

Ответ 18+ 🔞

Слушай, а вот этот typedef в Dart — это ж просто спасение для глаз, когда начинаешь писать эти ебушки-воробушки из сигнатур функций. Представь себе: пишешь ты код, а там параметр функции выглядит как int Function(int, int) operation. Читаешь это и думаешь: «Ёпта, что за манда с ушами?». А с typedef всё сразу становится на свои места.

Короче, основная фишка — сделать код читаемым, а не вот это вот всё:

// Вот так без typedef: выглядит страшно, будто хуй с горы на тебя летит.
void processOperation(int Function(int, int) operation) {
  print(operation(5, 3));
}

// А вот так с typedef: сразу понятно, что к чему. Красота!
typedef IntOperation = int Function(int, int);

void processOperationClean(IntOperation operation) {
  print(operation(5, 3));
}

int add(int a, int b) => a + b;
int multiply(int a, int b) => a * b;

void main() {
  IntOperation myOperation = add;
  processOperationClean(myOperation); // 8

  myOperation = multiply;
  processOperationClean(myOperation); // 15
}

Ну и, конечно, его можно юзать не только для функций. Иногда коллекции такие сложные получаются, что на них смотреть — терпения ноль, ебать. Тут typedef тоже выручает.

// Псевдоним для этой дикой структуры. Иначе волнение ебать каждый раз, когда видишь.
typedef UserList = List<Map<String, dynamic>>;

UserList fetchUsers() {
  return [
    {'id': 1, 'name': 'Alice'},
    {'id': 2, 'name': 'Bob'},
  ];
}

Что важно помнить, чтобы не облажаться:

  • С Dart 2.13 можно и с дженериками дружить: typedef Mapper<T> = T Function(String); — очень удобно.
  • Это всё магия компилятора, в рантайме никакого нового типа не возникает, просто алиас.
  • Главная цель — не выёбываться, а сделать код чистым. Читаешь IntOperation и сразу ясно, что это функция, которая два int принимает и int возвращает. А не гадаешь, какого хуя тут наворочено. Рефакторить потом в овердохуища раз проще.