Какая разница между undefined и void?

🎯 Зачем спрашивают
  • Проверить, умеет ли кандидат различать типы и значения в TypeScript.
  • Понять, насколько он понимает, что у void и undefined разные сценарии применения.
  • Оценить, может ли кандидат объяснять семантику намерений в коде: когда функция явно «ничего не возвращает», а когда «может вернуть отсутствие значения».
  • Отличить кандидата, который «поверхностно юзает TS», от того, кто реально понимает типовую систему и её нюансы.
 
📝 Ответ
Коротко:
  • undefined — конкретное значение и тип, который его описывает.
  • void — абстрактный тип, означающий «отсутствие результата» (хотя в рантайме это всё равно undefined).
 
Подробнее:
undefined — это значение в JavaScript.
Тип undefined в TS означает, что переменная может содержать только это значение. Обычно встречается в union-типах, чтобы показать «значение может отсутствовать».
let a: undefined = undefined; // ✅ ок let b: undefined = 42; // ❌ ошибка type MaybeString = string | undefined; let c: MaybeString = "hello"; // ✅ let d: MaybeString = undefined; // ✅

void — это тип, а не значение. Используется как возвращаемый тип функций: «функция ничего не возвращает».
На практике функция с void всё равно возвращает undefined, но TS не заставляет это явно указывать.
function log(msg: string): void { console.log(msg); // Если в функции нет оператора return, то она автоматически возвращает undefined. // Можно явно вернуть undefined, все будет ок, но писать необязательно // return undefined; } // log2(msg: string): void function log2(msg: string) { console.log(msg); } const result: void = log("hi"); // result существует, но им пользоваться не имеет смысла
 
 
⚖️ Компромиссы
TODO
 
🔎 Встречные вопросы
  • Чем void отличается от never?
  • Как void ведёт себя в дженериках? (Promise<void> vs Promise<undefined>).
  • Почему void иногда используется в коллбэках (например, в map(() => void))?
 
🚩 Красные флаги
  • void и undefined — это одно и то же
  • void запрещает функции возвращать значения» (не совсем: можно вернуть undefined.
  • undefined всегда надо явно указывать в return при void.
 
🛠 Практика
Определи, где использовать undefined, а где void
// Что здесь корректнее и почему? function fetchUser(): ??? { ... } // user может не существовать function logUser(user: User): ??? { ... } // просто пишет в консоль
 
📚 Источники / ссылки