0Pricing
Dart Academy · Урок

Расширения для обобщённых типов

Расширение List, Iterable и параметров типов

«Расширения для обобщённых типов» — бесплатный урок Dart Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.

Расширение коллекций

Настоящее волшебство проявляется при расширении обобщённых типов, таких как List или Iterable. Одно расширение может сразу помочь с элементами любого типа.

Объявление параметра типа

Укажите параметр типа после имени расширения, а затем используйте его в конструкции on. Теперь Ваша вспомогательная возможность полностью безопасна с точки зрения типов.

extension Firsts<T> on List<T> {
  T? get firstOrNull => isEmpty ? null : this[0];
}

Тип элемента передаётся дальше

Поскольку Вы написали List of T, Ваш метод автоматически возвращает правильный тип элемента. Никаких приведений типов и неожиданных значений dynamic.

List<int> nums = [1, 2, 3];
int? n = nums.firstOrNull; // typed as int?

Расширяйте Iterable для большего охвата

Если расширять Iterable, а не List, вспомогательная возможность будет работать одинаково со списками, множествами и ленивыми итерируемыми последовательностями. Более широкий охват — тот же код.

extension Counts<T> on Iterable<T> {
  int countWhere(bool Function(T) f) => where(f).length;
}

Обобщённые методы внутри

Метод расширения тоже может иметь собственные обобщённые параметры, независимые от типа, который Вы расширяете.

extension Mapping<T> on List<T> {
  List<R> mapTo<R>(R Function(T) f) => map(f).toList();
}

Вывод типов помогает Вам

Dart обычно выводит аргументы типа из значения, для которого Вы вызываете метод, поэтому места вызова остаются короткими и понятными.

var first = ["a", "b"].firstOrNull; // String?

Расширение Map двумя типами

Отображениям нужны два параметра. Напишите Map of K, V — и сможете создавать вспомогательные возможности, учитывающие и ключи, и значения.

extension MapPick<K, V> on Map<K, V> {
  V? pick(K key) => this[key];
}

Сохраняйте безопасность при работе с null

Возврат T? вместо T показывает, что значение может отсутствовать, и заставляет вызывающий код учитывать это при проверке на null.

extension SafeLast<T> on List<T> {
  T? get lastOrNull => isEmpty ? null : last;
}

Повторное использование для разных типов элементов

Одно обобщённое расширение подходит для любого типа элементов. Один и тот же firstOrNull работает с числами, строками и Вашими собственными классами.

var who = <User>[].firstOrNull; // User?

Добавляйте ограничения при необходимости

Если вспомогательной возможности нужны определённые свойства, добавьте ограничение bound с помощью extends, чтобы разрешить только подходящие типы элементов.

extension Sums<T extends num> on List<T> {
  num total() => fold(0, (a, b) => a + b);
}

Почему обобщённые расширения лучше

Они объединяют повторное использование и безопасность: Вы пишете вспомогательную возможность один раз, а она адаптируется к любому типу элемента, сохраняя правильный тип результата.

Быстрая проверка

Проверим, как сохранять типобезопасность расширений.

Итоги: обобщённые расширения

Вы можете добавить к расширению параметр типа, нацелить его на List, Iterable или Map и даже ограничить его с помощью extends, сохранив повторное использование и безопасность. ✅

Часто задаваемые вопросы

Урок «Расширения для обобщённых типов» бесплатный?

Да — полный текст урока «Расширения для обобщённых типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.

Чему я научусь в уроке «Расширения для обобщённых типов»?

Расширение List, Iterable и параметров типов Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Dart Academy?

Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Расширения для обобщённых типов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Dart Academy?

Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Написание первого расширения
  2. Расширения для обобщённых типов
  3. Статические члены расширений и конфликты
  4. Типы-расширения для обёрток без затрат
← Назад к Dart Academy