Подтвердить что ты не робот

В чем разница между never и void в typescript?

Я прочитал этот, но неясно, какая разница между типами "никогда" и "недействительными"?

4b9b3361

Ответ 1

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

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

Ответ 2

Чтобы увеличить Ли очень хороший ответ, еще один способ подумать, что в правильно напечатанной программе значение never не может быть соблюдено.

В дополнение к функциям, которые никогда не возвращаются (или которые всегда вызывают исключения), вы увидите тип never, когда тип объединения был исчерпан из всех его возможных составляющих:

// Example assumes --strictNullChecks
function fn(x: number | string) {
  if (typeof x === 'number') {
    // x: number in this block
  } else if (typeof x === 'string') {
    // x: string in this block
  } else {
    // x: never in this block
    // this block does not run; the value of x cannot be observed
  }
}

Ответ 3

Кроме того, для более теоретической причины, с --strictNullChecks новым флагом, TypeScript нужен новый нижний тип (поскольку null и undefined больше нет). Тип never является таким нижним типом и делает систему типа TypeScript более последовательной.

Ответ 4

Короче говоря:

void return void, never никогда не возвращаются.

Ответ 5

Никогда не является информацией о том, что эта конкретная часть не должна быть доступна. Например, в этом коде

function do(): never {
    while (true) {}
}

у вас есть бесконечный цикл, и мы не хотим повторять бесконечный цикл. Просто так.

Но реальный вопрос в том, как это может быть полезно для нас? Это может быть полезно, например, при создании более сложных типов, чтобы указать , что они не являются

например, давайте объявим наш собственный тип NonNullable:

type NonNullable<T> = T extends null | undefined ? never : T;

Здесь мы проверяем, является ли T нулевым или неопределенным. Если это так, то мы указываем, что это никогда не должно произойти. Тогда при использовании этого типа:

let value: NonNullable<string>;
value = "Test";
value = null; // error

Void - это информация о том, что функции с этим типом не возвращают никакого значения, но они достижимы и могут быть использованы.

Ответ 6

Возвращаемый тип Promise.reject() равен Promise<never>, что означает, что он никогда не разрешен.

Итак, если функция возвращает Promise<never>, я думаю, что она вернет только ошибки. С другой стороны, Promise<void> может быть разрешен без значения.

Ответ 7

Как Мариус Шульц обсуждает в этой статье,

  • Функция, которая не возвращает явно значение , неявно возвращает значение undefined в JavaScript. Хотя мы обычно говорим, что такая функция "ничего не возвращает", она возвращает. Мы обычно игнорируем возвращаемое значение в этих случаях. Предполагается, что такая функция имеет тип возвращаемого значения void в TypeScript.
  • Функция с возвращаемым типом never никогда не возвращается. Он также не возвращает undefined. Функция не имеет нормального завершения, что означает, что она выдает ошибку или никогда не завершает работу вообще.