Что такое тип Never в Dart?

Ответ

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

Основные случаи использования:

  1. Функции, которые всегда выбрасывают исключение:

    // Функция имеет тип возвращаемого значения `Never`
    Never throwAssertionError(String message) {
      throw AssertionError(message);
    }
    
    void validateInput(String input) {
      if (input.isEmpty) {
        throwAssertionError('Input cannot be empty!');
      }
      // Анализатор потока знает, что если input был пустым,
      // выполнение до этой точки не дойдет.
      print('Valid input: $input');
    }
  2. Функции с бесконечным циклом: Например, сервер, слушающий сокеты.

    Never runServerForever() {
      while (true) {
        // Обработка запросов...
      }
      // Конец функции никогда не будет достигнут.
    }
  3. Улучшение анализа потока управления: Компилятор (анализатор) использует Never для более точного определения достижимости кода. Это помогает выявлять ошибки и избегать лишних проверок на null.

    String getValueOrThrow(Map<String, String> map, String key) {
      final value = map[key];
      if (value == null) {
        throw StateError('Key not found'); // Неявно возвращает `Never`
      }
      // Анализатор понимает, что здесь `value` точно не null,
      // потому что в противном случае выполнение было бы прервано.
      return value;
    }

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

Ответ 18+ 🔞

Давай разберёмся с этим Never, а то смотришь на него и думаешь — хуй с горы, что за зверь такой. По факту, это тип, который говорит компилятору: «Слушай, чувак, отсюда мы уже не вернёмся. Точка невозврата».

Где это, блядь, применяется:

  1. Функции, которые только и делают, что орут и кидаются исключениями. Ну серьёзно, их работа — устроить скандал и накрыться медным тазом.

    // Тип возврата `Never` — это как предупреждение: «Не жди отсюда добра».
    Never throwAssertionError(String message) {
      throw AssertionError(message); // Всё, приехали. Дальше код не пойдёт.
    }
    
    void validateInput(String input) {
      if (input.isEmpty) {
        throwAssertionError('Input cannot be empty!'); // Сказали же — Never.
      }
      // Анализатор — он не дурак, он понимает. Если мы тут, значит input НЕ пустой.
      // Доверие к нему — ноль ебать, но он реально это отслеживает.
      print('Valid input: $input');
    }
  2. Функции-зомби, которые уходят в бесконечный цикл. Сервер какой-нибудь, который должен работать, пока его не вырубят.

    Never runServerForever() {
      while (true) { // Ну всё, приплыли. Пока питание есть, мы отсюда не выйдем.
        // Тут он что-то делает...
      }
      // Сюда выполнение никогда не доползёт, ёпта. Это и есть Never.
    }
  3. Главная фишка — умный анализ кода. Дарт смотрит на Never и делает выводы, чтобы мы не писали лишних проверок.

    String getValueOrThrow(Map<String, String> map, String key) {
      final value = map[key];
      if (value == null) {
        throw StateError('Key not found'); // Неявно возвращает `Never`
      }
      // Анализатор тут такой: «О, так если value был null, то выше мы уже вылетели с ошибкой!
      // Значит, в этой точке value — точно не null. Расслабься».
      return value; // И никаких вопросиков или восклицательных знаков!
    }

Короче, суть в чём: Never — это не просто какая-то абстракция для умников. Это реальный инструмент, который делает твой код надёжнее. Он явно кричит и системе типов, и тебе самому: «Э, бошка, думай! Здесь дорога обрывается». И тогда компилятор тебя подстрахует, не даст сделать глупость. Вещь, в общем-то, полезная, хоть и выглядит как мартышлюшка какая-то на первый взгляд.