Generic Class
Tujuan Pembelajaran
Section titled “Tujuan Pembelajaran”Setelah membaca halaman ini, kamu diharapkan dapat:
- Membuat Class bertipe Generic menggunakan parameter
<T>. - Menginstansiasi objek dari Class Generic.
- Mengelola data secara dinamis di dalam class menggunakan tipe
T.
Pendahuluan
Section titled “Pendahuluan”Kita sudah belajar membuat Class di BAB 8. Class biasanya dikunci untuk tipe data tertentu. Contoh: class DaftarSiswa menyimpan array string nama siswa.
Bagaimana jika kita ingin membuat sebuah class penyimpanan serbaguna (seperti data struktur Stack, Queue, atau Repository data) yang bisa menyimpan tipe data apa saja, tetapi tetap menjaga keamanan tipe? Kita membuat Generic Class.
Penjelasan Materi: Membuat Class Generic
Section titled “Penjelasan Materi: Membuat Class Generic”Sintaks pembuatan Class Generic meletakkan <T> setelah nama class:
class Penyimpanan<T> { private data: T[] = [];
tambah(item: T): void { this.data.push(item); }}Saat menginstansiasi objek, kita tentukan tipe datanya di dalam tanda kurung sudut <...>:
const simpanAngka = new Penyimpanan<number>();Analogi Kehidupan Sehari-hari: Loker Penyimpanan Barang (Laci)
Section titled “Analogi Kehidupan Sehari-hari: Loker Penyimpanan Barang (Laci)”Bayangkan sebuah lemari loker penyimpanan serbaguna:
Loker Sekolah (Generic Class <T>) ├── Diisi HP (T) ──► Loker HP (Hanya boleh titip HP) ├── Diisi Laptop (T) ──► Loker Laptop (Hanya boleh titip Laptop) └── Diisi Buku (T) ──► Loker Buku (Hanya boleh titip Buku)Struktur fisik lokernya sama (sekat, pintu, kunci). Namun jenis barang yang diizinkan masuk dan keluar (tipe data) ditentukan oleh label stiker yang ditempel di depan loker saat pertama kali disewa oleh siswa.
Visual Illustration: Class Generic
Section titled “Visual Illustration: Class Generic”Class Loker<T> { isi: T }
const loker1 = new Loker<string>() ──► loker1.isi bertipe stringconst loker2 = new Loker<number>() ──► loker2.isi bertipe numberDari Mana Constructor Mendapatkan Tipe?
Section titled “Dari Mana Constructor Mendapatkan Tipe?”TypeScript cukup cerdas. Jika kamu mengirim data awal ke dalam constructor, TypeScript bisa menebak tipe Generic secara otomatis (Type Inference) tanpa kamu perlu menulis tanda <...>:
const loker = new Loker("Buku"); // Terinferensi otomatis sebagai Loker<string>Mari Mencoba: Class Penyimpanan Data Serbaguna
Section titled “Mari Mencoba: Class Penyimpanan Data Serbaguna”Mari kita buat class LokerPenyimpanan untuk menyimpan barang apa saja secara dinamis.
Buat file bernama src/bab9/generic-class.ts:
// 1. Membuat Class Genericclass LokerPenyimpanan<T> { private barang: T[] = [];
constructor(public namaLoker: string) {}
// Method menerima tipe T public simpan(item: T): void { this.barang.push(item); console.log(`[${this.namaLoker}]: Berhasil menyimpan 1 barang.`); }
// Method mengembalikan tipe T atau undefined public ambilTerakhir(): T | undefined { return this.barang.pop(); }
public dapatkanJumlah(): number { return this.barang.length; }}
// 2. Instansiasi Loker khusus Stringconst lokerBuku = new LokerPenyimpanan<string>("LOKER BUKU");lokerBuku.simpan("Kamus Bahasa Jepang");lokerBuku.simpan("Buku Novel");
console.log("Buku yang diambil:", lokerBuku.ambilTerakhir()?.toUpperCase());
// 3. Instansiasi Loker khusus Numberconst lokerUang = new LokerPenyimpanan<number>("LOKER UANG");lokerUang.simpan(50000);lokerUang.simpan(100000);
console.log("Uang yang diambil : Rp", lokerUang.ambilTerakhir()?.toLocaleString("id-ID"));Jalankan dengan perintah:
tsx src/bab9/generic-class.tsOutput
Section titled “Output”[LOKER BUKU]: Berhasil menyimpan 1 barang.[LOKER BUKU]: Berhasil menyimpan 1 barang.Buku yang diambil: BUKU NOVEL
[LOKER UANG]: Berhasil menyimpan 1 barang.[LOKER UANG]: Berhasil menyimpan 1 barang.Uang yang diambil : Rp 100.000Penjelasan Baris per Baris
Section titled “Penjelasan Baris per Baris”class LokerPenyimpanan<T>— Mendefinisikan class Generic. Properti privatebarangdideklarasikan sebagai array bertipeT[].public simpan(item: T)— Parameteritemdikunci bertipeT.new LokerPenyimpanan<string>("LOKER BUKU")— Instansiasi loker khusus string.lokerBuku.ambilTerakhir()?.toUpperCase()— Karena tipe datanya terjamin string, kita bisa menggunakan method khusus string secara aman menggunakan optional chaining.
Latihan
Section titled “Latihan”- Buat class Generic
KotakDaftar<T>dengan properti private array dataT[]dan methodtambah(item: T)sertatampilkanSemua(): void. - Buat objek untuk menyimpan daftar nilai angka siswa dan panggil method-methodnya.
Ringkasan
Section titled “Ringkasan”- Class Generic ditulis dengan sintaks
class Nama<T> { ... }. - Digunakan untuk membuat struktur penyimpanan/utilitas data serbaguna.
- Mengamankan operasi manipulasi data internal agar terhindar dari salah tipe data.