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

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

  • Курсы
    • FrontendИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • логотип PurpleSchool
    • Сообщество
    • PurpleПлюс
    • 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 391

    Комментарии

    0

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

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

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

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

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

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

    Основы Git

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

    HTML и CSS

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

    CSS Flexbox

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