🎯 Зачем спрашивают
- Проверить, умеет ли кандидат различать типы и значения в 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>vsPromise<undefined>).
- Почему
voidиногда используется в коллбэках (например, вmap(() => void))?
🚩 Красные флаги
voidиundefined— это одно и то же
voidзапрещает функции возвращать значения» (не совсем: можно вернутьundefined.
undefinedвсегда надо явно указывать в return при void.
🛠 Практика
Определи, где использовать undefined, а где void
// Что здесь корректнее и почему? function fetchUser(): ??? { ... } // user может не существовать function logUser(user: User): ??? { ... } // просто пишет в консоль