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

Užkoduoti tikrą API formą

15 pamokoje kompiliatorius parodė dvi klaidas. Dabar jas išspręsim — ne pridėdami apsaugas ranka, o užkoduodami tikrą API formą į tipus, kad tos klaidos taptų neįmanomos parašyti.

Diskriminuota sąjunga (discriminated union) — pamokos širdis. APOD grąžina arba nuotrauką, arba vaizdo įrašą. Aprašom juos kaip du atskirus tipus su bendru diskriminantu media_type:

interface ApodImage { media_type: 'image'; hdurl?: string; /* ... */ }
interface ApodVideo { media_type: 'video'; /* NO hdurl */ }
type Apod = ApodImage | ApodVideo;

media_type: 'image' — ne string, o literalas 'image'. Todėl, kai patikrini media_type, kompiliatorius susiaurina (narrows) tipą:

if (pic.media_type === 'image') {
  pic.hdurl;   // ✅ egzistuoja
} else {
  pic.hdurl;   // ❌ kompiliavimo klaida — vaizdo įrašai neturi hdurl
}

6 pamokos media_type klaida — vaizdo nuoroda <img> viduje — dabar neparašoma. Kompiliatorius neleis pasiekti hdurl, kol nepatikrinsi tipo.

Literalų sąjungos. Tas pats principas mažoms reikšmėms. Rating = 0 | 1 | 2 | 3 | 4 | 5 vietoj numberrating = 47 tampa klaida. Teisėtų reikšmių aibė ir yra tipas.

Neteisingos būsenos, kurios neišreiškiamos. Vanilla kode isLoading ir error buvo atskiri kintamieji — niekas netrukdė abiem būti true vienu metu, o UI tokią „neįmanomą" būseną rodydavo kaip nesąmonę. Modeliuojam kaip sąjungą, ir ta kombinacija tampa nesukonstruojama.

Tai — vienas galingiausių tipų principų: neteisingas būsenas padaryti neišreiškiamas (make illegal states unrepresentable). Ne „tikimės, kad niekas nesukurs blogos būsenos", o „blogos būsenos net negalima aprašyti".