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