Tema
/
Interneto svetainių kliento dalies kūrimas JS
📖 Teorija

Skylė: tipai netikrina, ką gavai

16 pamokoje aprašėm tipus, ir kompiliatorius pradėjo mus saugoti. Bet yra skylė — ir svarbu ją suprasti, kad nepasitikėtum tipais aklai.

response.json() grąžina any. Pagalvok, ką tai reiškia:

const data = await response.json();   // data: any
const pics: Apod[] = data;            // ✅ kompiliatorius patenkintas... bet KODĖL?

any išjungia tipų tikrinimą. Kompiliatorius tiki, kad dataApod[], nes tu taip pasakei. Bet iš tikro to netikrino. Jei NASA rytoj pakeis atsakymo formą (pervadins url į image_url), tipai nieko nepasakys — programa lūš vykdymo metu, o TypeScript tylės.

Tai esminė mintis: tipai aprašo, ko TIKIESI; jie netikrina, ką GAVAI. TypeScript neapsaugos nuo API, kuris pasikeitė, nuo sugadinto JSON ar nuo null ten, kur tikėjaisi objekto. Tipai — kompiliavimo meto pažadas, ne vykdymo meto skydas.

Sprendimas — tikrinti prie RIBOS. Ties vieta, kur nepatikimi duomenys įeina į programą (tinklo atsakymas, localStorage, URL), parašom tipo sargą (type guard):

function isApod(value: unknown): value is Apod { /* patikrina laukus */ }

Grąžinamas tipas value is Apod — ypatingas. Jis sako kompiliatoriui: „jei ši funkcija grąžino true, gali value laikyti Apod". Taip nepatikimas unknown virsta patikimu tipu — bet tik po tikros, vykdymo meto patikros.

Ir dvi susijusios idėjos, kurias pridėsim:

  • Readonly<AppState> — vaizdai gali būseną skaityti, bet ne keisti. Vienintelis kelias keisti — veiksmas (kaip 9 pamokoje, tik dabar priverstinai).
  • catch (error) yra unknown, ne any — nes JavaScript leidžia throw 42. unknown verčia susiaurinti prieš naudojant.