Intersection type (&) menggabungkan beberapa type menjadi satu — objek harus memiliki semua property dari semua type.
type HasName = { nama: string }
type HasAge = { umur: number }
type Person = HasName & HasAge
// Person harus punya: nama DAN umur
Union vs Intersection:
A | B— bisa A atau BA & B— harus A dan B
keyof — mengambil semua nama property dari sebuah type sebagai union:
type User = { nama: string; umur: number; email: string }
type UserKeys = keyof User // "nama" | "umur" | "email"
Indexed Access Types — mengakses type dari property tertentu:
type NamaType = User["nama"] // string
type UmurType = User["umur"] // number
Pattern berguna — generic getter yang type-safe:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key]
}
const user = { nama: "Budi", umur: 17 }
getProperty(user, "nama") // type: string ✅
getProperty(user, "foo") // Error! ❌