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

Ответ

В TypeScript undefined используется для обозначения отсутствующего значения. Основные случаи:

  1. Неинициализированные переменные

    let x: number; // x имеет значение undefined
  2. Опциональные параметры функций

    function greet(name?: string) {
      // name может быть string или undefined
    }
  3. Возвращаемое значение функций без return

    function logMessage(msg: string): void {
      console.log(msg);
      // Неявно возвращает undefined
    }
  4. Явное указание отсутствия значения

    interface User {
      name: string;
      middleName?: string; // middleName: string | undefined
    }
  5. Работа с strictNullChecks С включенной опцией strictNullChecks типы undefined и null становятся отдельными, что помогает избежать ошибок.

Для безопасной работы с потенциально undefined значениями в Node.js проектах часто используют:

  • Опциональную цепочку (?.)
    const userName = user?.profile?.name;
  • Оператор объединения с null (??)
    const port = process.env.PORT ?? 3000;
  • Тип-гарды
    if (value !== undefined) {
      // TypeScript знает, что здесь value определено
    }

Ответ 18+ 🔞

Э, слушай, вот про undefined в TypeScript — это вообще отдельная песня, блядь. Типа, ну представь себе, что это такой официальный способ сказать «тут нихуя нет». Не null, не пустая строка, а именно нихуя, вакуум, пустота. И у него, ёпта, есть свои чёткие случаи применения, как будто это какой-то протокол.

Ну, во-первых, если ты объявил переменную, но нихуя в неё не положил — она undefined. Всё просто, как дважды два.

let x: number; // x сейчас — нихуя, то есть undefined. Чистая правда.

Во-вторых, когда ты в функции пишешь параметр с вопросиком — это же опционально, да? Ну так вот, если его не передали, то внутри функции он будет undefined. Хуй с горы, логично же.

function greet(name?: string) {
  // name может быть строкой, а может быть нихуя (undefined). Подозрение ёбать чувствую, когда такое вижу.
}

В-третьих, функция, которая нихуя не возвращает (тип void), на самом деле возвращает undefined. Типа, она отработала и молча ушла в закат, оставив после себя пустоту. Ядрёна вошь, какая философия.

Четвёртый пункт — это когда ты в интерфейсе или типе явно указываешь, что поле может отсутствовать. Ставишь вопросик — и всё, TypeScript сам понимает, что там string | undefined. Удобно, блядь, не надо голову ломать.

interface User {
  name: string;
  middleName?: string; // middleName: string | undefined. Может быть, а может и нихуя.
}

И самое главное, чувак, — это флаг strictNullChecks. Когда он включён, undefined и null — это два разных, блядь, типа. Нельзя просто так взять и присвоить undefined переменной, которая ждёт только число. Это спасает от кучи ошибок в рантайме, когда у тебя всё накрывается медным тазом. Доверия ёбать ноль к коду без этой опции.

Ну и в Node.js, чтобы не бздеть каждый раз, когда лезешь в глубины объекта или переменной окружения, есть парочка крутых фишек.

Опциональная цепочка (?.) — это просто магия, ёбать колотить. Раньше бы писал if (user && user.profile && user.profile.name), а теперь одной строчкой:

const userName = user?.profile?.name; // Если где-то нихуя — вернётся undefined, а не ошибка. Красота.

Оператор объединения с null (??) — тоже вещь. Он берёт значение справа, только если слева null или undefined. Не путай с ||, тот сработает на любом «ложном» значении, типа пустой строки или нуля.

const port = process.env.PORT ?? 3000; // Если в переменной окружения нихуя, будет 3000. Умно, сука.

Ну и старый добрый тип-гард. Просто проверяешь, что значение не undefined, и TypeScript внутри блока понимает, что там уже точно что-то есть. Э, бошка, думай!

if (value !== undefined) {
  // Здесь TypeScript уже не орёт, что value может быть нихуя. Он успокоился.
  // Можно работать спокойно.
}

Вот и вся история. Главное — не путать «отсутствие значения» с «неправильным значением», а то будет тебе хиросима и нигерсраки в продакшене.