Tema
/
Interneto svetainių kliento dalies kūrimas JS

src/types.ts — būsena kaip sąjunga

Kodo stulpelyje — būsenos tipai, pridedami į src/types.ts. Čia gyvena galingiausia idėja.

LoadStatus kaip sąjunga:

export type LoadStatus =
  | { state: 'idle' }
  | { state: 'loading' }
  | { state: 'loaded' }
  | { state: 'error'; message: string; retryable: boolean };

Palygink su vanilla: ten buvo isLoading (boolean) ir error (string) — atskiri. Niekas netrukdė:

isLoading = true;
error = 'Network failed';   // abu vienu metu — ką rodyti?!

UI tokią būseną rodydavo kaip nesąmonę (suktukas IR klaida). Sąjungoje ta kombinacija neegzistuoja: LoadStatus yra arba loading, arba error — niekada abu. Ir error variantas priverčia turėti message bei retryable; negali būti „klaida be žinutės".

AppState — visa būsena viename tipe (vietoj vanilla tuzino laisvų let). Pastebėk saved: SavedPicture[], kur SavedPicture turi rating: Rating — tad įvertinimas gali būti tik 0–5.

Kaip tuo naudotis (susiaurinimas per state):

switch (status.state) {
  case 'loading': showSpinner(); break;
  case 'error':   showError(status.message); break;   // message čia GARANTUOTAS
  case 'loaded':  render(); break;
  case 'idle':    break;
}

status.message pasiekiamas tik error šakoje — kitur jo nėra, ir kompiliatorius tai žino.

Patarimas. Kodėl { state: 'error'; message; retryable }, o ne tik message?? Nes taip tipas garantuoja: jei būsena klaida — žinutė BŪTINAI yra. Su message? galėtum turėti „klaidą be žinutės" ir vėl rodytum tuščią ekraną. Tipas užkoduoja ne tik „kokie laukai galimi", bet ir „kurie laukai kartu turi prasmę".