Tema
/
Interneto svetainių kliento dalies kūrimas JS

src/types.ts — Apod diskriminuota sąjunga

Kodo stulpelyje — src/types.ts domeno tipai. ApodImage ir ApodVideo — dvi sąsajos, o Apod — jų sąjunga.

Trys detalės, kurios daro visą darbą:

  • media_type: 'image' (ne string) — literalas. Tai diskriminantas, leidžiantis susiaurinimą.
  • hdurl?: string tik ApodImage, o ApodVideo jo visai neturi. Klaustukas reiškia „neprivalomas" (string | undefined) — nes ir nuotrauka ne visada turi didelės raiškos versiją.
  • copyright?: string abiejuose — nes bet kuri nuotrauka gali būti be autoriaus (vieša nuosavybė).

Apod sąjunga:

export type Apod = ApodImage | ApodVideo;

Kai turi Apod, kompiliatorius nežino, kuris jis — tad neleidžia pasiekti hdurl, kol nepatikrinsi media_type. Būtent to reikėjo 15 pamokos TS2551 klaidai išspręsti: patikrinimas atrakina hdurl.

Rating — literalų sąjunga:

export type Rating = 0 | 1 | 2 | 3 | 4 | 5;   // ne number

Patikrink (mintimis arba tsc).

const pic: Apod = /* ... */;
pic.hdurl;                        // ❌ TS2339/2551 — ne visi Apod turi hdurl
if (pic.media_type === 'image') {
  pic.hdurl;                      // ✅ dabar egzistuoja
}
const r: Rating = 47;             // ❌ Type '47' is not assignable to type 'Rating'

Patarimas. Klaustukas (?) ir sąjunga (|) — du skirtingi „gali nebūti". hdurl?: string = „šis laukas gali būti nenurodytas". Apod = ApodImage | ApodVideo = „šis objektas gali būti vienas iš dviejų pavidalų". Kartu jie tiksliai aprašo netvarkingą tikrovę: kartais vaizdo įrašas, kartais be autoriaus, kartais be didelės raiškos.