intersectiontipe-dataMenengah3 mnt baca

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.
typescript
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.
typescript
type DenganID = { id: string };
type Pengguna = { nama: string } & DenganID;

const p: Pengguna = { nama: "Budi", id: "U1" }; // OK

Catatan teknis: Hati-hati menggabungkan properti yang bertentangan. { a: string } & { a: number } membuat properti a bertipe never (tidak ada nilai yang sekaligus string dan number), dan assignment apa pun ke sana error dengan pesan Type '...' is not assignable to type 'never'. Kalau intersection-mu tiba-tiba berperilaku aneh, cek konflik propertinya dulu.

Contoh Nyata: Memperluas Tipe Pihak Ketiga

typescript
// 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.

typescript
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">?