PurpleSchool — курсы программирования онлайн
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развития
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • Карьерные пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • PurpleSchool — курсы программирования онлайн
    • Сообщество
    • PurpleПлюс
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Тип never в Typescript

    Тип never в Typescript

    Аватар автора Тип never в Typescript

    Антон Ларичев

    Иконка календаря30 сентября 2022

    Типизация - это то, почему многие выбирают писать на TypeScript, а не на чистом JavaScript. Хотя на конференциях можно услышать доклады "Почему вам не нужен TS", в больших проектах без него просто не обойтись. А если писать на нём регулярно, то уже даже в небольших проектах обычный JS будет приносить только боль. Я это ощутил, при подготовке уроков по NodeJS для следующего курса, где не используется TypeScript.

    Потому важно понимать все особенности типизации. Разберём тип never, который многим, кто знакомится с TypeScript непонятен.

    Не путать с void!

    Тип void в возвращаемом типе функции, обозначает что функция ничего не возвращает (или по иному говоря возвращает undefined).

    const a = (): void => {
        return undefined;
    }
    

    В свою очередь переменной типа never можно присвоить только тип never и никакой другой. Кажется бесполезным? Рассмотрим 3 примера использования:

    Исчерпывающие проверки типов

    Вот пример функции, которая возвращает тип never:

    export const error = (message: string): never => {
        throw new Error(message);
    }
    

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

    export const typeRun = (x: string | number): boolean => {
        if (typeof x === 'string') {
            return true;
        } else if (typeof x === 'number') {
            return false;
        }
        return error("!");
    }
    

    Если бы не использовали never, TS бы выдавал ошибку, так как мы в теории могли бы попасть дальше проверки и вернуть undefined вместо boolean.

    Switch / case

    Рассмотрим следующий пример:

    export type Direction = 'up' | 'down';
    export const run = (direction: Direction) => {
        switch (direction) {
            case 'up':
                return 1;
            case 'down':
                return -1;
            default:
                const a: never = direction;
            }
    }
    

    Если у нас в Direction добавится новое направление, скажем right, то TypeScript за счёт типа подскажет, что у нас switch больше не валиден, так как при новом значении Direction мы уже можем попасть в default и у нас типу never будет присвоено значение другого типа, что недопустимо.

    Conditional types

    Благодаря never мы можем исключить не нужные типы. Например, сделаем тип, который если у нас передано значение с number мы присваиваем never. Тем самым мы оставляем только нужный тип в типе А:

    type NonNumber<T> = T extends number ? never : T;
    
    type A = NonNumber<string | number>; // A - всегда string
    
    Иконка глаза8 332

    Комментарии

    0

    Постройте личный план изучения Основы разработки до уровня Middle — бесплатно!

    Основы разработки — часть карты развития Frontend, Backend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Основы Git

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    HTML и CSS

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Neovim

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста FastAPI vs NestJS: какой бэкенд-фреймворк выбрать в 2026
    Иконка аватараАнтон
    Иконка календаря31 марта 2026
    pythonnestjstypescriptmiddleИконка уровня middle

    FastAPI vs NestJS: какой бэкенд-фреймворк выбрать в 2026

    Сравнение FastAPI и NestJS — двух популярных бэкенд-фреймворков для разработки API. Разбираем производительность, архитектуру, экосистему и помогаем выбрать подходящий инструмент для вашего проекта в 2026 году.

    Иконка чипа0
    Иконка глаза66
    Иконка комментариев0
    Картинка поста NestJS: как организовать модули, чтобы проект не стал монолитом
    Иконка аватараАнтон
    Иконка календаря28 марта 2026
    nestjstypescriptarchitecturemiddleИконка уровня middle

    NestJS: как организовать модули, чтобы проект не стал монолитом

    Организация модулей в NestJS определяет масштабируемость проекта. Разберем принципы модульной архитектуры, разделение по доменам и типичные ошибки, превращающие проект в монолит.

    Иконка чипа0
    Иконка глаза139
    Иконка комментариев0
    Картинка поста Оптимизация LCP: как я довёл Web Vitals до 1.5 секунд на реальном проекте
    Иконка аватараАнтон
    Иконка календаря27 марта 2026
    performancehtmlmiddleИконка уровня middle

    Оптимизация LCP: как я довёл Web Vitals до 1.5 секунд на реальном проекте

    Пошаговое руководство по оптимизации Largest Contentful Paint (LCP): от 4.8 до 1.5 секунд на реальном проекте. Изображения, шрифты, CSS, серверная оптимизация и конкретные примеры кода.

    Иконка чипа0
    Иконка глаза150
    Иконка комментариев0
    Иконка чипа0