TypeScript został stworzony z naciskiem na bezpieczne programowanie bez nadmiaru jawnych typów: większość typów zmiennych, parametrów, wartości zwracanych przez kompilator potrafi automatycznie wydedukować. System inferencji typów umożliwia pisanie kodu prawie jak w JavaScript, ale z zachowaniem ścisłego typowania, co znacznie przyspiesza rozwój i zmniejsza liczbę błędów.
Inferencja typów nie zawsze gwarantuje wydedukowanie tego typu, którego oczekuje programista. Powstają sytuacje, w których typ okazuje się zbyt szeroki (any lub unknown), lub odwrotnie — nadmiernie restrykcyjny. Prowadzi to albo do zbędnych ograniczeń, albo do braku sprawdzania typów, co w obu przypadkach jest niebezpieczne.
TypeScript automatycznie wydedukuje typ na podstawie przypisania lub z wartości zwracanej przez funkcję, jeśli typ nie jest jawnie określony. Zarządzać inferencją można za pomocą jawnego określenia typu, type assertion, generyków i specjalnych narzędzi (ReturnType, Parameters itp.). Praca ze złożonymi strukturami wymaga szczególnej uwagi: jeśli typ jest skomplikowany lub nieoczywisty, lepiej określić go jawnie.
Przykład kodu:
let a = 5; // number (wydedukowany automatycznie) function sum(x = 4, y = 3) { // x: number, y: number return x + y; // return: number } // Błąd podczas inferencji typu function getData(flag) { if (flag) return 123; // brak return w innym wydaniu — return type: number | undefined } // Lepiej jawnie: function getData(flag: boolean): number | undefined { if (flag) return 123; }
Kluczowe cechy:
Prawda/Fałsz: Inferencja typów zawsze daje ten sam typ, którego oczekuje programista
Fałsz. Czasami typ jest szerszy lub węższy, szczególnie dla tablic/obiektów/wartości zwracanych union (number | undefined — częsta niespodzianka).
Jeśli w obiekcie nie określi się typu, TypeScript zawsze zachowa dokładną strukturę
Nie, bez as const struktura będzie "rozszerzalna" (widened), z as const będzie readonly z literowymi typami.
const obj = { kind: "duck" }; // obj: { kind: string } const obj2 = { kind: "duck" } as const; // obj2: { readonly kind: "duck" }
Jeśli nie określi się typu dla tablicy, TS zawsze wie, z czego się składa
Nie, domyślnie TypeScript czyni tablicę maksymalnie "szeroką" — na przykład let arr = [1, 'a'] będzie (string | number)[], a nie krotką.
Backend zwraca obiekt odpowiedzi { data: [] }, typ jawnie nieokreślony, TypeScript wydedukowuje typ data: any[]. W pewnym momencie data staje się tablicą stringów — błąd pojawia się dopiero na produkcji.
Zalety:
Wady:
W projekcie przyjęto zawsze wyraźnie określać typy zwracanych wartości funkcji i złożonych struktur, używać as const dla stałych. Każda zmiana struktury jest sprawdzana przez kompilator.
Zalety:
Wady: