Расширения для обобщённых типов
Расширение 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 — локальная установка не требуется.
Все уроки этого курса
- Написание первого расширения
- Расширения для обобщённых типов
- Статические члены расширений и конфликты
- Типы-расширения для обёрток без затрат