src/lib/api.ts — tipo sargas prie ribos
Kodo stulpelyje — src/lib/api.ts. Du sprendimai daro visą darbą.
1. request() grąžina Promise<unknown>, ne Promise<any>. Skirtumas esminis:
any— „nesirūpink tipais, daryk ką nori". Skylė.unknown— „turi kažką, bet dar nežinai ką; privalai patikrinti prieš naudodamas".
Su unknown kompiliatorius neleis iškart naudoti rezultato kaip Apod[] — priverčia praeiti pro sargą.
2. Tipo sargas isApod:
function isApod(value: unknown): value is Apod {
if (typeof value !== 'object' || value === null) return false;
const v = value as Record<string, unknown>;
return (
typeof v['date'] === 'string' &&
typeof v['url'] === 'string' &&
(v['media_type'] === 'image' || v['media_type'] === 'video')
);
}
value is Apod — tai tipo predikatas. Jei funkcija grąžina true, kompiliatorius nuo tos vietos laiko value kaip Apod. Tikroji patikra vyksta vykdymo metu (tikrina laukus), o jos rezultatas atrakina tipą kompiliavimo metu.
Ir fetchPictures naudoja jį prie ribos:
return data.filter(isApod).reverse(); // išmeta bet ką netvarkingą, nelūžta
.filter(isApod) — gudru: ne tik patikrina, bet ir išfiltruoja blogus įrašus. Jei NASA grąžins vieną sugadintą nuotrauką, ji tiesiog dingsta, o galerija veikia. Grąžinamas tipas — jau švarus Apod[].
Patarimas. Sargą rašom vieną kartą, vienoje vietoje — prie tinklo ribos. Toliau visa programa dirba su patikimu
Apod, be jokių papildomų patikrų. Tai — „stumkany/unknownį pakraščius, o šerdį laikyk griežtai tipizuotą". Riba yra ten, kur nepatikimas pasaulis susitinka su tavo tipais.