TypeScript - Never: Понимание нижнего типа

Здравствуйте, стремящиеся к программированию! Сегодня мы погрузимся в один из более загадочных типов TypeScript: тип never. Не волнуйтесь, если вы новички в программировании - я проведу вас через это понятие шаг за шагом, так же, как я делал это для countless студентов на протяжении многих лет моей преподавательской деятельности. Так что возьмите свой любимый напиток и отправляйтесь в это увлекательное путешествие в мир TypeScript!

TypeScript - Never

Что такое тип never?

Тип never в TypeScript часто называют "нижним типом" или "пустым типом". Он представляет собой тип, который никогда не должен возникать. Сейчас вы, возможно, думаете: "Зачем нам тип, который никогда не happens?" Ну, мои любопытные друзья, он полезнее, чем вы можете себе представить!

Когда используется never?

  1. Для представления невозможных сценариев
  2. Для обработки исчерпывающих проверок
  3. В функциях, которые никогда не возвращают значение

Давайте рассмотрим несколько примеров, чтобы сделать эти концепции clearer.

Пример 1: Представление невозможных сценариев

function throwError(message: string): never {
throw new Error(message);
}

let result = throwError("Oops! Something went wrong!");
console.log(result); // Эта строка никогда не будет достигнута

В этом примере функция throwError гарантированно выбросит ошибку и никогда не вернет значение的正常но. Поэтому тип ее возвращаемого значения - never.

Представьте это так: если вы готовите торт и рецепт гласит "пеките до never", вы знаете, что торт не выйдет из духовки!

Пример 2: Исчерпывающие проверки

type Shape = "circle" | "square" | "triangle";

function getArea(shape: Shape): number {
switch (shape) {
case "circle":
return Math.PI * Math.pow(5, 2);
case "square":
return 10 * 10;
case "triangle":
return (10 * 5) / 2;
default:
const _exhaustiveCheck: never = shape;
return _exhaustiveCheck;
}
}

Здесь never помогает нам убедиться, что мы охватили все возможные фигуры. Если мы добавим новую фигуру к типу Shape, но забудем добавить для нее случай в getArea, TypeScript выдаст нам ошибку. Это как иметь полезного ассистента, который напоминает вам, когда вы что-то забыли!

Пример 3: Функции, которые никогда не возвращают значение

function infiniteLoop(): never {
while (true) {
console.log("This loop never ends!");
}
}

Эта функция будет работать forever (или до тех пор, пока у вашего компьютера не кончится память). Поскольку она никогда не заканчивает выполнение, ее тип возвращаемого значения - never. Это как сказать своему другу, что вы停 "никогда" - они знают, что их ждет долгий разговор!

Тип never против void

Теперь вы, возможно, задаетесь вопросом: "Как never differs от void?" Отличный вопрос! Давайте разберем это.

void

Тип void используется, когда функция не возвращает никакого значения, но она завершает свое выполнение.

function logMessage(message: string): void {
console.log(message);
}

logMessage("Hello, TypeScript!"); // Эта функция возвращает undefined

never

Тип never, с другой стороны, используется, когда функция никогда не завершает свое выполнение или всегда выбрасывает ошибку.

function failwithError(message: string): never {
throw new Error(message);
}

failwithError("This function never returns!");

Представьте это так: void - это как пойти в магазин и вернуться с пустыми руками, а never - это как отправиться в путешеcтвие безdestination - вы никогда не вернетесь!

Практическое использование never

Давайте рассмотрим еще несколько примеров, где never может быть полезен.

Пример 4: Гуарды типов

type Square = { kind: "square", size: number };
type Circle = { kind: "circle", radius: number };
type Shape = Square | Circle;

function assertNever(x: never): never {
throw new Error("Unexpected object: " + x);
}

function getArea(shape: Shape) {
switch (shape.kind) {
case "square": return shape.size * shape.size;
case "circle": return Math.PI * shape.radius ** 2;
default: return assertNever(shape); // Ошибка, если shape не является Square или Circle
}
}

В этом примере assertNever помогает нам caught любой случай, который мы могли пропустить. Это как иметь safety net, когда вы учитесь жонглировать типами!

Пример 5: Обнаружение недостижимого кода

function neverReaches(): never {
while (true) {
// Some operation
}
console.log("This line will never be reached");  // Ошибка TypeScript
}

TypeScript достаточно умен, чтобы понять, что строка console.log никогда не будет достигнута, и выдаст вам ошибку. Это как иметь GPS, который сообщает вам, когда вы пытаетесьехать в место, которое не существует!

Методы и свойства never

Теперь вы, возможно, задаетесь вопросом, есть ли у never какие-либо методы или свойства. Правда в том, что never не имеет своих собственных методов или свойств, так как он представляет тип, который никогда не должен возникать. Однако он по-прежнему является важной частью системы типов TypeScript.

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

Операция Результат Объяснение
Присваивать never ✅ Разрешено Любой тип можно присвоить never
Присваивать never другому типу ❌ Запрещено never нельзя присвоить другому типу
Вызывать методы на never ❌ Запрещено Поскольку never никогда не возникает, вы не можете вызывать методы на нем
Использовать never в union ✅ Разрешено, но не имеет эффекта never игнорируется в union типах
Использовать never в intersection ✅ Разрешено и结果是 never Любой тип, пересекающийся с never, результатов в never

Заключение

И вот мы с вами, мои дорогие студенты! Мы совершили путешествие по земле never, исследуя его закоулки. Помните, never как тот друг, который всегда отменяет планы - он никогда не arrives, но он по-прежнему важен для того, чтобы держать его в голове!

Понимание never может показаться сложным сначала, но с практикой вы найдете его неоценимым инструментом в вашем наборе инструментов TypeScript. Он помогает сделать ваш код более robust, обнаруживает потенциальные ошибки и даже заставляет вас глубже задумываться о поведении ваших функций.

Продолжайте программировать, продолжайте учиться и не говорите "никогда" пробовать новые вещи в TypeScript! До свидания, пусть ваши ошибки компиляции будут редки, а ваши типы推断 будут сильны!

Credits: Image by storyset