programowanieProgramista Fullstack

Wyjaśnij różnicę między typem never a void w TypeScript. Kiedy i dlaczego warto używać każdego z nich?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

void i never w TypeScript to różne typy:

  • void zazwyczaj używa się jako typ zwracany dla funkcji, które nic nie zwracają, tj. funkcja kończy wykonywanie, ale nie zwraca wartości.
  • never oznacza, że funkcja (lub wyrażenie) nigdy nie zakończy się pomyślnie: albo zawsze zgłasza wyjątek, albo nigdy nie zwraca kontroli (na przykład nieskończona pętla).

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 } }

Pytanie z podstępem.

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.