Тип Never в Dart
Большинство выражений в Dart имеют тип результата: строка, число, объект. Есть редкий случай, когда выражение не завершается возвратом значения - оно бросает ошибку или крутится без конца.
Для таких выражений в языке есть тип Never.
У него нет ни одного допустимого значения, зато он
помогает анализатору понимать ветки, где выполнение
обрывается:
Never stopWith(String message) {
throw ArgumentError(message);
}
void main() {
stopWith('bad');
}
Функция stopWith объявлена с результатом
Never, потому что после throw
управление не возвращается к вызывающему коду. Программа
останавливается с ошибкой. Любая попытка использовать
результат такой функции как обычное значение не имеет
смысла:
String requireText(String? value) {
return value ?? stopWith('text required');
}
Never stopWith(String message) {
throw ArgumentError(message);
}
void main() {
print(requireText('ok'));
}
Оператор ?? справа стоит вызов с типом
Never. Анализатор знает, что при
null слева программа прервется, а при
ненулевом значении вернется строка. Поэтому вся
функция requireText имеет тип String,
а не объединение с Never:
String pickLabel(String? code) {
return code ?? stopWith('code missing');
}
Never stopWith(String message) {
throw ArgumentError(message);
}
void main() {
var label = pickLabel('A-1');
print(label);
}
Сделайте функцию, которая принимает nullable-число
и возвращает обычное число. Если аргумент равен
null, выполнение должно завершиться
ошибкой с вашим текстом. Для 12 выведите
результат.
Напишите функцию без результата, которая всегда
уходит в бесконечный цикл. Укажите у этой функции
тип Never. В main сохраните ссылку
на нее в переменную и убедитесь, что код
компилируется.