Generic Interface
Tujuan Pembelajaran
Section titled “Tujuan Pembelajaran”Setelah membaca halaman ini, kamu diharapkan dapat:
- Membuat
interfacebertipe Generic. - Mengimplementasikan Generic Interface pada objek nyata.
- Menjelaskan keuntungan fleksibilitas dari Generic Interface.
Pendahuluan
Section titled “Pendahuluan”Di BAB 7 kita belajar bahwa interface menetapkan kontrak bentuk objek yang kaku. Namun, bagaimana jika salah satu properti di dalam objek tersebut harus bisa menampung tipe data yang berbeda-beda tergantung kebutuhan objek tersebut?
Kita menggunakan Generic Interface untuk merancang struktur data pembungkus yang serbaguna.
Penjelasan Materi: Menulis Generic Interface
Section titled “Penjelasan Materi: Menulis Generic Interface”Sintaks penulisan Generic Interface menggunakan tanda kurung sudut <T> setelah nama interface:
interface NamaInterface<T> { id: string; data: T; // tipe data akan ditentukan kemudian}Saat membuat objek dari interface ini, kita wajib menentukan tipe data T tersebut:
const objek: NamaInterface<number> = { id: "01", data: 100 // wajib number}Analogi Kehidupan Sehari-hari: Map Laporan Hasil Belajar (Rapor)
Section titled “Analogi Kehidupan Sehari-hari: Map Laporan Hasil Belajar (Rapor)”Bayangkan selembar Map Laporan Hasil Belajar:
Map Laporan (Generic Interface <T>) ├── Nama Siswa (wajib string) ├── Kelas (wajib string) └── Hasil Ujian (Tipe data T)Isi dari “Hasil Ujian” bisa berbeda-beda formatnya untuk tiap kelas:
- Kelas Teori: Hasil ujian berupa angka (seperti
90,85-Wadah<number>). - Kelas Praktik / Sikap: Hasil ujian berupa huruf predikat (seperti
"A","B"-Wadah<string>). - Kelas Proyek: Hasil ujian berupa objek laporan lengkap (seperti
{ judul: "Web Koperasi", skor: 95 }).
Format map luarnya sama, tetapi isi format nilainya (tipe data) disesuaikan dengan jenis pelajaran.
Visual Illustration: Generic Interface
Section titled “Visual Illustration: Generic Interface”Interface Response<T> { status: number, data: T }
Response<Siswa> ──► { status: 200, data: ObjekSiswa }Response<Buku> ──► { status: 200, data: ObjekBuku }Mari Mencoba: Interface Respon API Sekolah
Section titled “Mari Mencoba: Interface Respon API Sekolah”Mari kita buat program simulasi penerimaan data dari server sekolah menggunakan Generic Interface.
Buat file bernama src/bab9/generic-interface.ts:
type Siswa = { nama: string; kelas: string;};
type Guru = { nama: string; nip: number;};
// 1. Mendefinisikan Generic Interface untuk Respon Serverinterface ResponAPI<T> { status: string; code: number; data: T; // Tipe data dinamis sesuai kebutuhan}
// 2. Respon berisi data objek Siswaconst responSiswa: ResponAPI<Siswa> = { status: "success", code: 200, data: { nama: "Putra Ramadhan", kelas: "XI RPL 1" }};
// 3. Respon berisi data objek Guruconst responGuru: ResponAPI<Guru> = { status: "success", code: 200, data: { nama: "Pak Budi Santoso", nip: 19870615 }};
console.log("=== API SISWA ===");console.log(`Status: ${responSiswa.status} | Nama: ${responSiswa.data.nama}`);
console.log("\n=== API GURU ===");console.log(`Status: ${responGuru.status} | NIP : ${responGuru.data.nip}`);Jalankan dengan perintah:
tsx src/bab9/generic-interface.tsOutput
Section titled “Output”=== API SISWA ===Status: success | Nama: Putra Ramadhan
=== API GURU ===Status: success | NIP : 19870615Penjelasan Baris per Baris
Section titled “Penjelasan Baris per Baris”interface ResponAPI<T>— Membuat rancangan respon server serbaguna. PropertidatabertipeT.responSiswa: ResponAPI<Siswa>— Mengisi propertidatadengan objek bertipeSiswa. TypeScript otomatis memvalidasi properti di dalamnya agar memilikinamadankelas.responGuru: ResponAPI<Guru>— Mengisi propertidatadengan objek bertipeGuruyang memiliki propertinamadannip.
Kesalahan yang Sering Terjadi
Section titled “Kesalahan yang Sering Terjadi”❌ Mengirim tipe data data yang tidak cocok dengan cetak biru parameter
Section titled “❌ Mengirim tipe data data yang tidak cocok dengan cetak biru parameter”const responError: ResponAPI<Siswa> = { status: "success", code: 200, data: { nama: "Putra", nip: 12345 // Error! Property 'kelas' is missing, 'nip' does not exist in type 'Siswa'. }};Latihan
Section titled “Latihan”- Buat Generic Interface bernama
DaftarPilihan<T>dengan propertijudulMenu: stringdanpilihan: T[](array bertipe T). - Buat objek
menuStringberisi pilihan hari["Senin", "Selasa"]danmenuNumberberisi pilihan jam[8, 10, 13]. Tampilkan hasilnya.
Ringkasan
Section titled “Ringkasan”- Generic Interface mempermudah pembuatan cetak biru objek dengan properti yang tipe datanya dinamis.
- Ditulis dengan pola
interface Nama<T> { ... }. - Sangat berguna untuk memodelkan respon API, data repository, atau pembungkus status data.