Lewati ke konten

Error Corner BAB 9

Setelah membaca halaman ini, kamu diharapkan dapat:

  • Mengidentifikasi penyebab error umum pada Generic dan Utility Types.
  • Membaca pesan error compiler terkait parameter tipe Generic.
  • Memperbaiki kesalahan syntax pembatasan tipe (constraints) dan properti utilitas.

Tipe Generic dan Utility Types sangat membantu kerapian kode, tetapi juga memiliki aturan syntax yang ketat. Lupa mengirimkan parameter tipe, salah menuliskan nama properti pada Pick/Omit, atau mengabaikan status undefined pada Partial adalah kesalahan yang paling sering ditemui pemula.


Error 1 — Lupa Menuliskan Parameter Tipe Generic

Section titled “Error 1 — Lupa Menuliskan Parameter Tipe Generic”
📄 TypeScript
interface Box<T> {
isi: T;
}
const kotak: Box = { isi: "Buku" }; // Error!
// Generic type 'Box<T>' requires 1 type argument(s).

Interface Box didefinisikan memiliki satu parameter tipe Generic <T>. Saat membuat objek nyata, kamu wajib menentukan tipe data untuk menggantikan T.

📄 TypeScript
const kotak: Box<string> = { isi: "Buku" }; // ✓

Error 2 — Mengakses Properti pada Tipe Generic Tanpa Batasan (Constraint)

Section titled “Error 2 — Mengakses Properti pada Tipe Generic Tanpa Batasan (Constraint)”
📄 TypeScript
function sapaSiswa<T>(siswa: T): void {
// console.log(`Halo, ${siswa.nama}`); // Error!
// Property 'nama' does not exist on type 'T'.

TypeScript tidak bisa menjamin bahwa objek T yang dikirimkan memiliki properti bernama nama (karena T bisa saja diisi number biasa).

Gunakan extends (Generic Constraint) untuk membatasi tipe T agar wajib memiliki properti nama:

📄 TypeScript
interface MemilikiNama { nama: string }
function sapaSiswa<T extends MemilikiNama>(siswa: T): void {
console.log(`Halo, ${siswa.nama}`); // ✓ Aman
}

Error 3 — Mengubah Properti Objek hasil Readonly<T>

Section titled “Error 3 — Mengubah Properti Objek hasil Readonly<T>”
📄 TypeScript
type Siswa = { nama: string };
const s: Readonly<Siswa> = { nama: "Putra" };
s.nama = "Budi"; // Error!
// Cannot assign to 'nama' because it is a read-only property.

Utility Type Readonly mengunci seluruh properti objek secara mutlak. Nilainya tidak boleh diubah setelah diinisialisasi.

Jangan mengubah properti objek readonly. Jika data memang perlu diubah, gunakan tipe data biasa tanpa Readonly, atau buat objek salinan baru menggunakan spread operator ...:

📄 TypeScript
const sBaru = { ...s, nama: "Budi" }; // ✓ Aman & Immutable

Error 4 — Salah Menulis Nama Properti pada Pick atau Omit

Section titled “Error 4 — Salah Menulis Nama Properti pada Pick atau Omit”
📄 TypeScript
type Siswa = { nama: string; kelas: string };
type NamaSiswa = Pick<Siswa, "namaSiswa">; // Error!
// Type '"namaSiswa"' is not assignable to type '"nama" | "kelas"'.

Parameter kedua dari Pick atau Omit wajib berupa nama properti (key) yang benar-benar ada di dalam objek tipe asal.

📄 TypeScript
type NamaSiswa = Pick<Siswa, "nama">; // ✓ namaSiswa diganti nama

Error 5 — Salah Asumsi Bahwa Properti Partial Selalu Ada

Section titled “Error 5 — Salah Asumsi Bahwa Properti Partial Selalu Ada”
📄 TypeScript
type Siswa = { nama: string; email: string };
const editSiswa: Partial<Siswa> = { nama: "Putra" };
// console.log(editSiswa.email.toUpperCase()); // Error!
// Object is possibly 'undefined'.

Partial mengubah properti email menjadi opsional (email?: string). Karena boleh kosong, properti tersebut bernilai undefined pada objek editSiswa.

Gunakan optional chaining (?.) untuk mengakses nilainya dengan aman:

📄 TypeScript
console.log(editSiswa.email?.toUpperCase()); // ✓ Aman (menghasilkan undefined, bukan crash)

Perbaiki seluruh kesalahan dalam kode di bawah ini agar dapat dikompilasi tanpa error:

📄 TypeScript
interface Produk<T> {
id: string;
data: T;
}
const p: Produk = { id: "01", data: 100 };
type Siswa = { nama: string; umur: number };
type Detail = Pick<Siswa, "usia">;
const s: Readonly<Siswa> = { nama: "Dewi", umur: 16 };
s.umur = 17;

  • Pastikan menyertakan argumen tipe <...> pada komponen Generic yang mewajibkannya.
  • Gunakan extends untuk membatasi properti minimum pada tipe Generic bebas.
  • Parameter seleksi Pick/Omit harus cocok dengan nama properti asli.
  • Selalu amankan properti opsional hasil Partial menggunakan optional chaining ?..