Тип never

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

Тип never — это один из специальных типов TypeScript, который указывает на значения, которые никогда не могут появиться. Обычно он используется в двух случаях: когда функция всегда выбрасывает ошибку (и не возвращает управление) или когда в ней находится бесконечный цикл.

Также never незаменим при сужении типов (Type Narrowing) для проверки исчерпываемости (exhaustiveness checking) в конструкциях switch. Если вы обработали все возможные варианты union-типа, оставшийся тип будет never. Этот урок и практические задания научат вас отличать never от void и использовать его для создания надежного кода, который защищен от логических дыр.

Список тем

1. Void vs Never

id: 40632_ts_never_compare_01

Сопоставьте описание поведения функции в TypeScript с её возвращаемым типом (void или never). В левой колонке приведены описания поведения функций, а в правой — возможные возвращаемые типы. Обратите внимание, что тип never используется для функций, которые никогда не завершаются (например, выбрасывают исключение или содержат бесконечный цикл), а void — для функций, которые завершаются нормально, не возвращая значения.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Функция, которая выводит сообщение в консоль и завершается
Функция, которая всегда выбрасывает ошибку типа Error
Функция, которая содержит бесконечный цикл while(true)
Функция, которая возвращает undefined явно
Функция, которая завершается с ошибкой, выбрасывая строку
void
void
never
never
never
Сообщения
Проверить
Показать подсказку

2. Функции never

id: 40632_ts_never_click_02

Внимательно изучите приведённый ниже код на TypeScript, содержащий несколько объявлений функций. Ваша задача — кликнуть и выделить только те функции, которые должны иметь возвращаемый тип `never` (то есть функции, которые никогда не завершаются нормально: либо выбрасывают ошибку, либо содержат бесконечный цикл). Не отмечайте функции, которые возвращают какое-либо значение или тип, отличный от `never`.

Кликните по всем фрагментам, которые подходят под условие задания.
function {{processData~|~t1}}(input: string): void {
  console.log(input);
}

function {{throwError~|~t2}}(msg: string): never {
  throw new Error(msg);
}

function {{infiniteLoop~|~t3}}(): never {
  while (true) {
    // Бесконечный цикл
  }
}

function {{calculateSum~|~t4}}(a: number, b: number): number {
  return a + b;
}

function {{logMessage~|~t5}}(msg: string): void {
  console.log(msg);
}

function {{alwaysThrow~|~t6}}(): never {
  throw new TypeError('Invalid operation');
}
Сообщения
Проверить
Показать подсказку

3. Аннотация возвращаемого типа

id: 40632_ts_never_select_fill_03

В этом задании вам нужно дополнить код функции-обработчика ошибок, выбрав правильный тип возвращаемого значения из предложенных вариантов. Функция выбрасывает исключение и никогда не завершается нормально — подумайте, какой тип TypeScript лучше всего описывает такое поведение. Выберите подходящий вариант из выпадающего списка для каждого пропуска в коде.

Нужно правильно расставить в пропуски предложенные варианты
function handleError(errorMessage: string): input1S {
  throw new Error(errorMessage);
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Исчерпывающая проверка

id: 40632_ts_never_replace_04

В этом задании вам нужно дополнить код, который использует конструкцию switch для обработки различных типов данных. В блоке default переменная должна быть присвоена типу never для обеспечения исчерпывающей проверки. Впишите ключевое слово never в аннотацию переменной проверки, чтобы код компилировался и выполнялся корректно. Обратите внимание, что тип never используется для указания, что функция никогда не возвращает значение или что переменная не может иметь никакого значения.

Заполните пропуски
function processValue(value: string | number | boolean): string {
    switch (typeof value) {
        case 'string':
            return `Строка: ${value}`;
        case 'number':
            return `Число: ${value}`;
        case 'boolean':
            return `Булево: ${value}`;
        default:
            const exhaustiveCheck: input1S = value;
            throw new Error(`Неизвестный тип: ${exhaustiveCheck}`);
    }
}

console.log(processValue('Привет'));
console.log(processValue(42));
console.log(processValue(true));
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Ложная аннотация

id: 40632_ts_never_error_05

В этом фрагменте кода TypeScript функция помечена как возвращающая тип `never`, но внутри неё есть оператор `return true`. Это противоречит определению типа `never`, который указывает, что функция никогда не возвращает управление (например, всегда выбрасывает исключение или зацикливается). Найдите и исправьте строку с ошибкой, чтобы функция соответствовала своей аннотации типа.

Найдите ошибку и исправьте
function throwError(): never {
    return true;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Логика сужения типов

id: 40632_ts_never_sequencing_06

Перед вами строки TypeScript-кода, демонстрирующие использование типа never в конструкции switch для сужения типов. Строки перемешаны. Расставьте их в правильном порядке, чтобы получилась корректная функция, которая обрабатывает все возможные значения объединённого типа и завершается присваиванием к never в ветке default, если обнаруживается лишний тип. Это упражнение иллюстрирует логику сужения типов и гарантирует полноту обработки всех вариантов.

Расставьте строки в правильном порядке
      break;
    default:
}
    case 'circle':
    case 'square':
      break;
      console.log('Processing square');
      break;
      console.log('Processing triangle');
function processShape(shape: Shape): void {
  switch (shape) {
      throw new Error(`Unexpected shape: ${exhaustiveCheck}`);
      const exhaustiveCheck: never = shape;
  }
type Shape = 'circle' | 'square' | 'triangle';
      console.log('Processing circle');
    case 'triangle':
Сообщения
Проверить
Показать подсказку

7. Поведение кода

id: 40632_ts_never_predict_07

Проанализируйте приведённый код на TypeScript. Внимательно изучите функцию, возвращающую тип never, и её вызов. Что произойдёт при попытке выполнения этого кода? Выберите единственный правильный вариант поведения программы.

Выберите правильный вариант ответа
function throwError(message: string): never {
    throw new Error(message);
}

function processValue(value: number): string {
    if (value > 0) {
        return "Positive";
    } else if (value < 0) {
        return "Negative";
    } else {
        throwError("Value cannot be zero");
    }
}

console.log("Start");
const result = processValue(0);
console.log("Result:", result);
console.log("End");
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40632_compiler

Этот пример показывает тип never: функции, которые никогда не завершаются нормально (например, всегда бросают ошибку или бесконечно выполняются), и проверку исчерпывающих условий (exhaustive check) в switch. Поэкспериментируйте: добавьте новый вариант в union-тип Status и посмотрите, как компилятор заставит вас обработать его в switch через never. Попробуйте менять входные данные, раскомментируйте строки с «неправильными» примерами и понаблюдайте, где TypeScript запрещает присваивания и почему. Также можно написать свою функцию fail(msg): never и использовать её в разных местах вместо throw.

TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру