programowanieFrontend developer / Fullstack developer

Jak działa system automatycznego wnioskowania typów (type inference) w TypeScript? Jakie są poziomy wnioskowania typów i jakie błędy można popełnić, polegając na 'inteligencji' kompilatora?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

TypeScript posiada potężny system wnioskowania typów. W większości przypadków typy zmiennych, parametrów i wartości zwracanych są obliczane automatycznie w oparciu o kontekst. Istnieje kilka poziomów wnioskowania typów:

  • Proste wnioskowanie: przy deklarowaniu zmiennych bez jawnego typu
  • Wnioskowanie kontekstowe: gdy typ wyrażenia jest definiowany z kontekstu (np. obsługa zdarzeń)
  • Najlepszy wspólny typ: dla tablic z elementami różnych typów — szuka się najbardziej ogólnego

Przykłady:

let a = 2; // number let b = [1, "a"]; // (number | string)[] window.addEventListener('click', e => { // e: MouseEvent });

Ograniczenie: jeśli kompilator nie może jednoznacznie wywnioskować typu, wybierze najszerszy (zwykle jest to any), co pozbawia korzyści płynących z typowania.

Pytanie z pułapką

Czy typ argumentu funkcji jest automatycznie definiowany, jeśli nie jest jawnie określony, ale funkcja jest używana dalej z typowanym wartościami?

Błędna odpowiedź: Tak, TypeScript zawsze automatycznie "zgaduje" typ argumentu.

Poprawna odpowiedź: Nie. Tylko jeśli kontekst funkcji zawiera informacje o typie, argument otrzyma ten typ. W przeciwnym razie — będzie to any lub inny typ bazowy, co prowadzi do błędów. Zawsze warto jawnie typizować dane wejściowe.

Przykład:

function f(x) { return x.toFixed(2); // Błąd: x jest typu any }

Przykłady rzeczywistych błędów spowodowanych nieznajomością szczegółów tematu


Historia

W projekcie nie określono jawnie typu wartości zwracanej przez niestandardowy hak React, a TypeScript nie zauważył, że typ może być undefined. W rezultacie wywołanie metody obiektu bez sprawdzenia prowadziło do błędów w czasie wykonywania.


Historia

Podczas tworzenia tablicy wartości mixed-type końcowy typ automatycznie został wywnioskowany jako tablica any[], ponieważ typ nie został jawnie określony, co doprowadziło do utraty wszystkich korzyści płynących z typowania w dalszym kodzie.


Historia

Walidacja parametrów wejściowych usługi nie była typizowana, a polegała na "zgadnięciu" TypeScript. Po refaktoryzacji codebase automatyczne wnioskowanie dało zbyt ogólny typ, a błędy typów danych trafiły do produkcji.