typedef (псевдотип)

Определение

Назначение: Ключевое слово typedef позволяет создавать короткие имена для существующих типов данных, их также называют псевдотипами. Полная поддержка всех типов появилась в Dart 2.13; ранние версии работали только с типами функций.

Синтаксис: typedef Псевдоним = ИсходныйТип;

Пример: typedef IntList = List<int>;. После объявления можно использовать IntList вместо длинной записи List<int>.

typedef IntList = List<int>;
IntList il = [1, 2, 3];Code language: Dart (dart)

Поддержка обобщенных параметров

Псевдотипы могут содержать обобщенные типы, чтобы упростить сложные составные типы:

typedef ListMapper<X> = Map<X, List<X>>;Code language: Dart (dart)

ListMapper<String> полностью эквивалентно записи Map<String, List<String>>, код получается более компактным и читаемым.

typedef ListMapper<X> = Map<X, List<X>>;
Map<String, List<String>> m1 = {}; // Длинная стандартная запись
ListMapper<String> m2 = {}; // Тот же тип, короче и понятнееCode language: Dart (dart)

Псевдотипы для функций

Можно задать псевдоним для сигнатуры функции, чтобы унифицировать формат функций в коде:

typedef Compare<T> = int Function(T a, T b);Code language: Dart (dart)

Любая функция с сигнатурой (T, T) → int относится к типу Compare<T>. Оператор is проверяет соответствие типов.

typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // Проверка даёт true
}
Code language: Dart (dart)

Практические примеры

// Объявление псевдотипов
typedef IntList = List<int>;
typedef StringMap = Map<String, dynamic>;

void main() {
  // Прямое использование псевдонимов
  IntList nums = [10, 20, 30];
  StringMap info = {"name": "dart", "version": "2.18"};

  print(nums);
  print(info);
}Code language: JavaScript (javascript)
// Обобщенный псевдотип: ключ X, значение — массив типа X
typedef ListMapper<X> = Map<X, List<X>>;

void main() {
  // Длинная стандартная запись
  Map<String, List<String>> oldData = {
    "fruit": ["apple", "banana"]
  };

  // Сокращенная запись через typedef, типы идентичны
  ListMapper<String> newData = {
    "fruit": ["apple", "banana"]
  };

  print(oldData);
  print(newData);
}Code language: Dart (dart)
// Обобщенный псевдотип функции: два параметра T, возвращает целое число
typedef Compare<T> = int Function(T a, T b);

// Функция подходит под Compare<int>
int intSort(int a, int b) => a - b;
// Функция подходит под Compare<String>
int strSort(String a, String b) => a.length - b.length;

void main() {
  // Проверка типов во время выполнения
  assert(intSort is Compare<int>);
  assert(strSort is Compare<String>);

  // Передача функции как аргумента
  List<int> arr = [5, 1, 3];
  arr.sort(intSort);
  print(arr); // Вывод: [1, 3, 5]
}Code language: Dart (dart)

typedef (псевдотип)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *