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

«Что такое тип Never в Dart?» — вопрос из категории Dart Core, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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, который делает код более безопасным и выразительным, явно обозначая точки невозврата.