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 tikmessage?? Nes taip tipas garantuoja: jei būsena klaida — žinutė BŪTINAI yra. Sumessage?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ę".