Intersection Type
Menggabungkan beberapa tipe jadi satu dengan &: semua syarat harus dipenuhi.
Analogi: Syarat yang Harus Dipenuhi Semua
Syarat ikut lomba: HARUS siswa kelas XII DAN HARUS punya kartu pelajar. Satu saja tidak terpenuhi, gugur. Intersection (&) adalah "DAN"-nya TypeScript: nilai harus memenuhi semua tipe yang digabungkan.
Beda dengan Union
- Union
A | B: boleh A atau B. - Intersection
A & B: harus A dan B sekaligus.
interface PunyaNama { nama: string; }
interface PunyaUmur { umur: number; }
type Lengkap = PunyaNama & PunyaUmur;
const x: Lengkap = { nama: "Budi", umur: 17 }; // wajib dua-duanya
const y: Lengkap = { nama: "Ani" };
// Error: Property 'umur' is missing in type '{ nama: string; }'
// but required in type 'PunyaUmur'.Kapan Dipakai di Project Nyata
- Menggabungkan props komponen:
type ButtonProps = BaseProps & { onClick: () => void }. - Menambah kemampuan ke tipe pihak ketiga yang tidak bisa kamu ubah:
type PenggunaLokal = UserDariLibrary & { avatar: string }. - Menggabungkan object config dari beberapa sumber jadi satu tipe utuh.
type DenganID = { id: string };
type Pengguna = { nama: string } & DenganID;
const p: Pengguna = { nama: "Budi", id: "U1" }; // OKCatatan teknis: Hati-hati menggabungkan properti yang bertentangan.
{ a: string } & { a: number }membuat propertiabertipenever(tidak ada nilai yang sekaligus string dan number), dan assignment apa pun ke sana error dengan pesanType '...' is not assignable to type 'never'. Kalau intersection-mu tiba-tiba berperilaku aneh, cek konflik propertinya dulu.
Contoh Nyata: Memperluas Tipe Pihak Ketiga
// Tipe dari library, tidak bisa diubah
interface TombolDasar {
label: string;
disabled?: boolean;
}
// Tambah kemampuan tanpa menyentuh library-nya
type TombolKonfirmasi = TombolDasar & {
onKonfirmasi: () => void;
teksKonfirmasi?: string;
};
const t: TombolKonfirmasi = {
label: "Hapus",
onKonfirmasi: () => console.log("dihapus"),
};Tanpa intersection, opsinya cuma dua dan dua-duanya buruk: menyalin seluruh properti TombolDasar (salinan jadi basi saat library update) atau memodifikasi file library (hilang saat reinstall). Intersection memberi jalan ketiga yang bersih.
Kapan Jangan Pakai Intersection
Kalau kedua belah pihak adalah interface milikmu sendiri, extends biasanya lebih enak dibaca dan pesan errornya lebih jelas. Intersection bersinar saat menggabungkan type alias, atau saat satu sisi datang dari luar (library, tipe bawaan) sehingga tidak bisa di-extends. Intinya: pakai extends untuk hierarki milik sendiri, pakai intersection untuk komposisi lintas sumber. Pilih dengan sadar berdasarkan siapa pemilik tipe yang digabungkan.
Tantangan
Gabungkan dua peran
Buat interface Karyawan { nip: string; divisi: string } dan interface Mentor { skill: string[] }, lalu type MentorKaryawan = Karyawan & Mentor. Buat object yang valid dan satu yang sengaja kurang properti untuk melihat errornya.
interface Karyawan { nip: string; divisi: string; }
interface Mentor { skill: string[]; }
type MentorKaryawan = Karyawan & Mentor;
const valid: MentorKaryawan = { nip: "001", divisi: "IT", skill: ["TS", "React"] };
// const salah: MentorKaryawan = { nip: "002", divisi: "HR" }; // ???Kuis Bab
Uji pemahamanmu: Tipe Data Lanjutan
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Apa bahaya mendeklarasikan let daftar = [] tanpa anotasi?
2.Apa beda tuple dan array biasa?
3.Kapan memakai interface dan kapan memakai type alias?
4.Apa arti string | number?
5.Apa hasil dari Pick<User, "id" | "nama">?