Learn
← Previous Next →

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