Ответ
В 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возвращает. А не гадаешь, какого хуя тут наворочено. Рефакторить потом в овердохуища раз проще.