Learn
← Previous Next →

Hari 3: Union & Intersection Types

60 min Last updated 09 Apr 2026

Union Types — Salah Satu dari Beberapa Tipe

// Union: nilai bisa salah satu tipe
type ID = string | number;
let userId: ID = "abc123";
userId = 42;  // juga OK

type Status = "aktif" | "nonaktif" | "pending"; // literal union
let status: Status = "aktif";
// status = "lainnya"; // Error!

Narrowing — Mempersempit Tipe dalam Union

function proses(input: string | number): string {
    if (typeof input === "string") {
        // di sini TypeScript tahu input adalah string
        return input.toUpperCase();
    }
    // di sini TypeScript tahu input adalah number
    return input.toFixed(2);
}

console.log(proses("hello")); // "HELLO"
console.log(proses(3.14));    // "3.14"

Intersection Types — Gabungan Tipe

type Identitas = { id: number; nama: string };
type Alamat = { kota: string; provinsi: string };

// Intersection: harus punya semua properti
type KontakLengkap = Identitas & Alamat;

const kontak: KontakLengkap = {
    id: 1,
    nama: "Budi",
    kota: "Jakarta",
    provinsi: "DKI Jakarta",
};

// Mixin pattern dengan intersection
type WithTimestamp = { createdAt: Date; updatedAt: Date };
type Post = { judul: string; konten: string } & WithTimestamp;

💡 Notice: Discriminated Union (sukses: true/false) memungkinkan TypeScript tahu properti mana yang tersedia setelah narrowing.

Assignment

Buat type Result<T> = { sukses: true; data: T } | { sukses: false; error: string }. Buat fungsi bagi(a, b) yang return Result<number>. Test dengan b=5 dan b=0.

Expected output:

Hasil: 2
Error: Tidak bisa bagi dengan nol
TS index.ts
Solution
Output