Я прочитал этот, но неясно, какая разница между типами "никогда" и "недействительными"?
В чем разница между never и void в typescript?
Ответ 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
. Функция не имеет нормального завершения, что означает, что она выдает ошибку или никогда не завершает работу вообще.