Ці три типи описують різні ситуації «функція нічого корисного не повертає».
void - результат функції не використовується:
function logEvent(name: string): void {
console.log(name);
}
Усередині функції з явно вказаним void повертати значення не можна - return 1 дасть помилку.
Але тип функції з void поводиться інакше: функцію, що щось повертає, можна присвоїти змінній типу () => void:
type Callback = () => void;
const cb: Callback = () => 42; // дозволено
const items: number[] = [];
[1, 2].forEach((n) => items.push(n)); // push повертає number - і це нормально
Це зроблено навмисно: колбек на кшталт forEach ігнорує результат, і вимагати «нічого не повертати» було б незручно. Наслідок - const result = cb() має тип void, а не number: використовувати його не варто.
undefined - функція повертає значення undefined, і викликач може на це покладатися:
function find(id: number): User | undefined {}
Для «нічого не повертає» в типах функцій зазвичай пишуть void, а undefined - коли значення має сенс (T | undefined).
never - функція ніколи не завершується нормально: кидає виняток або нескінченно виконується.
function fail(message: string): never {
throw new Error(message);
}
function assertNever(value: never): never {
throw new Error(`Неочікуване значення: ${value}`);
}
TypeScript використовує never в аналізі потоку: код після виклику fail() вважається недосяжним, а в звуженні типу never означає «варіантів не лишилося» - це основа перевірки вичерпності в switch.
Коротко: void - «результат не цікавить», undefined - «повертає саме undefined», never - «не повертає взагалі».