void i never w TypeScript to różne typy:
Przykłady:
function log(message: string): void { console.log(message); } function throwError(message: string): never { throw new Error(message); } function infinite(): never { while (true) {} }
never często używa się do kontroli pełności switch-case według typów:
type Shape = { kind: 'circle' } | { kind: 'square' }; function getArea(shape: Shape) { switch (shape.kind) { case 'circle': return 1; case 'square': return 2; default: const _exhaustive: never = shape; // Kompilator podpowie, jeśli brak case } }
Czy void i never mogą być używane wymiennie jako zwracane typy funkcji?
Odpowiedź: Nie. Funkcja o typie void zwraca undefined lub nic nie zwraca, ale kończy wykonanie. Funkcja o typie never nigdy nie kończy się pomyślnie (rzuca błąd lub wchodzi w nieskończoną pętlę).
Przykład:
const fn: () => never = () => { // return; // Błąd: Funkcja, której deklarowany typ to 'never', nie może zwracać. };
Historia
W systemie analitycznym funkcję walidatora typowano z typem zwracanym void, mimo że zawsze zgłaszała wyjątek. W rezultacie programiści sądzili, że funkcja może "powrócić", i nie stosowali dalszych kontroli, przez co ominęli obsługę błędów i błędnie zrealizowali łańcuch wywołań.
Historia
W jednym z projektów funkcję TypeScript, oczekującą wyraźnie typowanego typu zwracanego, określono jako zwracającą never, a nie void. W wyniku tego próba wywołania funkcji z callbackiem, który był typowany jako never, doprowadziła do błędów kompilacji i utraty zgodności API.
Historia
W module backendowym wcześniej zgłaszano wyjątek za pomocą funkcji z typem zwracanym void. Po migracji na TypeScript kompilator nie ostrzegał o wyjściu poza kod po wywołaniu tej funkcji, co doprowadziło do zbędnych linii „niedosięgającego” kodu — tylko zmiana typu zwracanego na never umożliwiła odkrycie takich miejsc i uczynienie kodu czystszej, unikając błędu logicznego.