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'(nestring) — literalas. Tai diskriminantas, leidžiantis susiaurinimą.hdurl?: stringtikApodImage, oApodVideojo visai neturi. Klaustukas reiškia „neprivalomas" (string | undefined) — nes ir nuotrauka ne visada turi didelės raiškos versiją.copyright?: stringabiejuose — 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.