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 data — Apod[], 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)yraunknown, neany— nes JavaScript leidžiathrow 42.unknownverčia susiaurinti prieš naudojant.