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