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

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

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Возврат undefined из функции

    Возврат undefined из функции

    Аватар автора Возврат undefined из функции

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

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

    Давайте рассмотрим пример следующей функции:

    async function getUser(id: number): Promise<User> {
        // получение пользователя из базы, 
        // если не находит, то возвращает undefined
        return db.query(/*...*/);
    }
    

    Если у вас не стоит strict режим или поставлена опция "strictNullChecks": false в tsconfig.json ошибки не будет.

    Чем это плохо? Мы не очевидно получаем поведение, где мы передаём id и ожидаем пользователя, а на самом деле можем получить undefined. В результате надо не забыть сделать соответствующую проверку. Давайте сделаем это очевиднее!

    Разберём отличия

    Прежде чем переходить к решению, давайте разберём, чем отливается null от undefined.

    • null - ключевое слово языка, которое отображается отсутствие того или иного объекта. Его мы не можем получить случайно, это значение умышленно поставлено.
    • undefined - обозначает отсутствие значение в принципе и его мы можем получить случайно.

    Мы можем получить undefined например:

    • Не задав переменную.
    • Обратившись к несуществующему свойству объекта.
    • Не передав аргумент в функцию.

    Исходя из этого, полагаться на то, что это значение осмысленное - плохо. Если мы явно хотим обозначить отсутствие значение следует использовать null. Как тогда меняется наша функция?

    Подход с null

    Давайте сделаем api нашей функции явным:

    async function getUser(id: number): Promise<User | null> {
        const user: User = db.query(/*...*/);
        if(!user) {
            return null;
        }
        return user;
    }
    

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

    Плохой подход с exception

    Есть ещё более плохой подход, где у нас функция при не нахождении пользователя кидает ошибку:

    async function getUser(id: number): Promise<User> {
        const user: User = db.query(/*...*/);
        if (!user) {
            throw new Error('Пользователь не найден');
        }
        return user;
    }
    

    Тут управление потоком исполнение становится не линейным и не очевидным и нужно не забыть всё обложить try / catch. Так точно делать не нужно, так как мы получаем вместо последовательного кода прыжки по обработчикам ошибок.

    Иконка глаза2 592

    Комментарии

    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 ₽
    Подробнее
    изображение курса

    CSS Flexbox

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    бесплатно
    Подробнее

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

    Картинка поста Тестирование React-компонентов с React Testing Library
    Иконка аватараАнтон
    Иконка календаря07 июля 2026
    reacttestingreact-testing-library+ 2middleИконка уровня middle

    Тестирование React-компонентов с React Testing Library

    React Testing Library — инструмент для тестирования React-компонентов через поведение пользователя, а не детали реализации. Примеры, паттерны, частые ошибки.

    Иконка чипа0
    Иконка глаза18
    Иконка комментариев0
    Картинка поста Микрофронтенды и Module Federation: подходы и реализация
    Иконка аватараАнтон
    Иконка календаря06 июля 2026
    микрофронтендыmodule-federationwebpack+ 2seniorИконка уровня senior

    Микрофронтенды и Module Federation: подходы и реализация

    Микрофронтенды с Module Federation: как разбить монолитный фронтенд на независимые части, которые деплоятся и разрабатываются отдельно.

    Иконка чипа0
    Иконка глаза50
    Иконка комментариев0
    Картинка поста Индексы в PostgreSQL: типы, применение и подводные камни
    Иконка аватараАнтон
    Иконка календаря05 июля 2026
    PostgreSQLбазы данныхиндексы+ 3middleИконка уровня middle

    Индексы в PostgreSQL: типы, применение и подводные камни

    Разбираем все типы индексов PostgreSQL: B-Tree, Hash, GIN, GiST, BRIN. Когда и какой индекс выбрать, чтобы ускорить запросы и не замедлить запись.

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