← Назад к вопросам

Для чего нужен Never?

1.0 Junior🔥 81 комментариев
#Dart

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Назначение типа Never

Тип Never в Dart — это специальный тип, который представляет значение, которое никогда не существует. Это так называемый bottom type в теории типов. Практически это означает, что функция/выражение, имеющее тип Never, никогда не вернёт управление вызывающему коду нормальным образом.

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

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

Если функция всегда выбрасывает исключение и никогда не возвращает значение, её тип возврата — Never:

Never throwError(String message) {
  throw Exception(message);
}

Never unreachableCode() {
  throw UnsupportedError("This should never be called");
}

Это позволяет типизированию и анализаторам понимать, что код после вызова такой функции недостижим.

2. Функции, которые никогда не завершаются (бесконечный цикл)

Never infiniteLoop() {
  while (true) {
    print("Running forever");
  }
}

3. Функции выхода из приложения

Never exitApp() {
  exit(0); // Процесс завершается
}

Практические преимущества

Анализ потока управления (Control Flow Analysis)

Дартовский анализатор использует Never для детектирования недостижимого кода:

void handleError(Object error) {
  if (error is String) {
    print(error);
  } else {
    throw Error(); // Never
  }
  // После throw анализатор знает, что это недостижимо
  print("unreachable");
}

Улучшенная типизация с guard clauses

void processUser(User? user) {
  if (user == null) {
    _handleNullUser(); // Never
  }
  // После этого анализатор знает, что user точно не null
  print(user.name);
}

Never _handleNullUser() {
  throw StateError("User cannot be null");
}

Never vs void vs Null

  • void — функция не возвращает полезное значение, но завершает работу нормально
  • Null — это тип значения null, которое может быть возвращено
  • Never — функция НИКОГДА не завершает работу нормально (выбрасывает или зависает)

Использование в обработке ошибок

Часто используется в pattern-matching и assert:

String getStatus(UserState state) {
  return switch (state) {
    Active() => "Active",
    Inactive() => "Inactive",
    _ => throw UnimplementedError(), // Never
  };
}

Выводы

Тип Never — это мощный инструмент для:

  • Явного обозначения функций, которые никогда не возвращают управление
  • Помощи типизированию и анализаторам в детектировании ошибок
  • Улучшения безопасности кода через лучший анализ потока управления
  • Написания более надёжного и понятного кода

Правильное использование Never делает код более выразительным и помогает избежать ошибок на этапе анализа.