TypeScript - Never: Понимание нижнего типа
Здравствуйте, стремящиеся к программированию! Сегодня мы погрузимся в один из более загадочных типов TypeScript: тип never
. Не волнуйтесь, если вы новички в программировании - я проведу вас через это понятие шаг за шагом, так же, как я делал это для countless студентов на протяжении многих лет моей преподавательской деятельности. Так что возьмите свой любимый напиток и отправляйтесь в это увлекательное путешествие в мир TypeScript!
Что такое тип never?
Тип never
в TypeScript часто называют "нижним типом" или "пустым типом". Он представляет собой тип, который никогда не должен возникать. Сейчас вы, возможно, думаете: "Зачем нам тип, который никогда не happens?" Ну, мои любопытные друзья, он полезнее, чем вы можете себе представить!
Когда используется never?
- Для представления невозможных сценариев
- Для обработки исчерпывающих проверок
- В функциях, которые никогда не возвращают значение
Давайте рассмотрим несколько примеров, чтобы сделать эти концепции 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