Chapter 5

Generik Lanjutan dan Utilitas Bawaan

Pelajari teknik generik tingkat lanjut seperti mapped types, conditional types, dan utilitas bawaan TypeScript untuk menulis kode yang lebih aman dan reusable. Bab ini akan membekali Anda dengan keterampilan untuk mengoptimalkan tipe dalam proyek skala besar.

Menggunakan Mapped Types untuk Transformasi Tipe

Mapped types memungkinkan Anda membuat tipe baru dengan mengiterasi properti dari tipe yang ada, sering digunakan bersama generik untuk transformasi seperti membuat semua properti nullable atau readonly.

type Nullable<T> = {
[P in keyof T]: T[P] | null;
};
interface Product {
id: number;
name: string;
}
type NullableProduct = Nullable<Product>; // { id: number | null; name: string | null; }

Ini berguna dalam skenario seperti validasi form atau API responses di mana data mungkin tidak lengkap.

Tip: Gunakan mapped types untuk menghindari duplikasi kode dan memastikan konsistensi tipe di seluruh aplikasi.

Menerapkan Conditional Types untuk Logika Tipe Dinamis

Conditional types memungkinkan Anda membuat tipe yang berubah berdasarkan kondisi, menggunakan sintaks T extends U ? X : Y. Ini sangat berguna untuk menangani skenario kompleks di mana tipe perlu disesuaikan secara dinamis.

type IsString<T> = T extends string ? true : false;
type Result1 = IsString<'hello'>; // true
type Result2 = IsString<number>; // false

Contoh praktis: membuat tipe yang mengekstrak tipe elemen dari array.

type ElementType<T> = T extends (infer U)[] ? U : never;
type NumArray = number[];
type Extracted = ElementType<NumArray>; // number

Dengan conditional types, Anda dapat membangun sistem tipe yang lebih fleksibel dan kuat.

Studi Kasus: Membangun Sistem Konfigurasi dengan Generik Lanjutan

Bayangkan Anda mengembangkan sistem konfigurasi untuk aplikasi web yang mendukung berbagai lingkungan (development, production). Dengan generik lanjutan, Anda dapat membuat tipe yang aman dan dapat dikustomisasi.

Sebuah startup e-commerce membutuhkan sistem konfigurasi yang mendukung multiple environment dengan validasi tipe otomatis.
Ringkasan konteks proyek
LangkahImplementasiOutput
Definisi Tipe Dasarinterface Config<T extends string> { env: T; apiUrl: string; }Tipe generik untuk environment
Pembuatan Utilityfunction createConfig<T extends string>(config: Config<T>): Config<T> { return config; }Fungsi pembuat konfigurasi yang type-safe
Validasi dengan Conditional Typestype EnvType<T> = T extends 'dev' | 'prod' ? T : never;Membatasi nilai environment yang valid

Dengan pendekatan ini, sistem menjadi lebih robust dan mudah diperluas.

Memahami Utilitas Bawaan TypeScript untuk Generik

TypeScript menyediakan beberapa utilitas bawaan yang mempermudah manipulasi tipe generik, seperti Partial<T>, Readonly<T>, dan Pick<T, K>. Utilitas ini membantu dalam pengembangan yang lebih efisien dengan mengurangi boilerplate code.

UtilitasDeskripsiContoh Penggunaan
Partial<T>Membuat semua properti dalam tipe T menjadi opsionaltype UserPartial = Partial<User>;
Readonly<T>Membuat semua properti dalam tipe T menjadi hanya-bacatype ReadonlyUser = Readonly<User>;
Pick<T, K>Memilih subset properti dari tipe T berdasarkan kunci Ktype UserName = Pick<User, 'name'>;

Dengan memahami utilitas ini, Anda dapat menulis kode yang lebih ringkas dan mudah dipelihara.

Best Practices untuk Mengoptimalkan Penggunaan Generik Lanjutan

Untuk menghindari kompleksitas berlebihan, ikuti best practices saat bekerja dengan generik lanjutan di TypeScript.

  • Gunakan dokumentasi yang jelas: Tambahkan komentar untuk menjelaskan logika conditional atau mapped types yang kompleks.
  • Hindari over-engineering: Jangan membuat tipe yang terlalu rumit jika solusi sederhana sudah cukup; evaluasi kebutuhan proyek.
  • Lakukan testing tipe: Gunakan alat seperti tsc --noEmit untuk memastikan tipe generik berfungsi seperti yang diharapkan tanpa error.
  • Manfaatkan utilitas bawaan: Sebelum membuat tipe kustom, periksa apakah utilitas seperti Partial atau Pick sudah memenuhi kebutuhan.

Dengan menerapkan praktik ini, Anda dapat menjaga kode tetap bersih, efisien, dan mudah dipahami oleh tim.

Quiz

Kerjakan soal setelah membaca materi untuk memperkuat pemahaman.