Hari 17: Discriminated Unions Lanjutan
60 min
Last updated 09 Apr 2026
State Machine dengan Discriminated Unions
// Fetch state machine
type FetchState =
| { status: "idle" }
| { status: "loading" }
| { status: "success"; data: T; timestamp: Date }
| { status: "error"; error: Error; retries: number };
function renderState(state: FetchState): string {
switch (state.status) {
case "idle": return "Belum dimulai";
case "loading": return "Memuat...";
case "success": return `Data: ${JSON.stringify(state.data)}`;
case "error": return `Error (${state.retries}x): ${state.error.message}`;
}
}
let state: FetchState<{ nama: string }> = { status: "idle" };
console.log(renderState(state));
state = { status: "loading" };
console.log(renderState(state));
state = { status: "success", data: { nama: "Budi" }, timestamp: new Date() };
console.log(renderState(state));
state = { status: "error", error: new Error("Timeout"), retries: 3 };
console.log(renderState(state));
💡
Notice: State machine + discriminated union = kode yang predictable dan bug-resistant. Setiap state memiliki data yang relevan dan TypeScript memastikan kamu handle semua state.
Assignment
Implementasikan validasi form dengan state machine: Idle → Validating → Valid | Invalid. Buat fungsi transisi state dan render state.
Expected output:
Form siap diisi
Memvalidasi email...
Sukses! Email: budi@example.com
TS
index.ts
Solution
Output