Tema
/
Interneto svetainių kliento dalies kūrimas JS

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 — „stumk any/unknown į pakraščius, o šerdį laikyk griežtai tipizuotą". Riba yra ten, kur nepatikimas pasaulis susitinka su tavo tipais.