Mapping API Responses
Mengubah response API menjadi model UI yang kecil, typed, dan tidak membuat component bergantung pada detail transport data.
Tujuan belajar
- Membedakan API response dan model yang dibutuhkan component
- Menulis mapper kecil di data boundary
- Menormalisasi nama field serta format display sebelum render
- Menghindari asumsi response API valid hanya karena TypeScript memberi type
Isi lesson
6 blok- 1.Component tidak perlu mengenal semua detail response APIBelum selesaiWajib
- 2.Ubah response course menjadi card modelBelum selesaiWajib
- 3.Coding practiceBelum selesaiWajib
- 4.Cek pemahamanBelum selesaiWajib
- 5.Jangan memakai as sebagai jalan pintas untuk response yang tidak diketahuiBelum selesaiWajib
- 6.RingkasanBelum selesaiWajib
Component tidak perlu mengenal semua detail response API
WajibAPI sering menggunakan nama field, nesting, tanggal, atau nullable value yang tidak nyaman untuk UI. Bila detail itu disebarkan langsung ke banyak component, perubahan endpoint akan memaksa banyak render layer ikut berubah. Letakkan transformasi di boundary: response mentah masuk, model UI yang jelas keluar.
Mapper bukan tempat untuk menyembunyikan data yang rusak. Ia menyatakan keputusan UI, misalnya lesson_count menjadi lessonLabel atau updated_at menjadi updatedLabel. Validasi runtime tetap perlu saat data datang dari sumber yang tidak dapat dipercaya. TypeScript membantu menjelaskan shape yang diharapkan, tetapi tidak memeriksa payload production dengan sendirinya.
Bagian ini memengaruhi progres lesson.
Ubah response course menjadi card model
Wajibtype CourseApiResponse = {
id: string;
title: string;
lesson_count: number;
updated_at: string;
};
type CourseCardModel = {
id: string;
title: string;
lessonLabel: string;
updatedLabel: string;
};
export function toCourseCard(
response: CourseApiResponse,
): CourseCardModel {
return {
id: response.id,
title: response.title.trim(),
lessonLabel: `${response.lesson_count} lesson`,
updatedLabel: new Date(response.updated_at).toLocaleDateString("id-ID"),
};
}CourseCard hanya perlu id, title, dan dua label siap tampil. Ia tidak perlu mengetahui snake_case API atau format tanggal sumber. Jika tanggal invalid atau field dapat null, model response serta validation boundary harus menyatakannya secara eksplisit sebelum mapper membuat keputusan display.
Bagian ini memengaruhi progres lesson.
Coding practice
WajibDibuka di workspace khususMap course API response to card model
Map response course dari bentuk transport ke data card yang siap dirender tanpa membuat component mengenal detail API. Preview tidak memanggil endpoint course.
Tujuan awal: Fokus di tab TSX.
Practice ini dibuka di workspace khusus. Buka practice untuk memakai editor, preview, dan cek otomatis.
Tombol selesai aktif setelah semua validasi wajib lolos.
Cek pemahaman
WajibJawab duluCek pemahaman singkat
Apa alasan utama memakai mapper sebelum data API dirender oleh component card?
Progres lesson naik setelah jawaban benar.
Peringatan
WajibJangan memakai as sebagai jalan pintas untuk response yang tidak diketahui
Menulis `response as CourseApiResponse` tidak memeriksa payload pada runtime. Jika endpoint belum terpercaya, gunakan validation di boundary, misalnya schema yang sesuai, lalu map hasil yang valid. Hindari membuat mapper raksasa yang sekaligus fetch, validate, format, menyimpan state, dan merender JSX. Pecah tanggung jawabnya saat complexity benar-benar muncul.
Bagian ini memengaruhi progres lesson.
Ringkasan
Wajib- API response adalah bentuk transport; component membutuhkan model UI yang jelas.
- Mapper menjaga detail endpoint tidak menyebar ke banyak component.
- Format display dan label dapat ditentukan sekali di data boundary.
- TypeScript tidak menggantikan validation runtime untuk payload yang tidak tepercaya.
- Berikutnya, optimistic UI mengubah tampilan sebelum server mengonfirmasi sehingga recovery harus dirancang lebih dahulu.
Bagian ini memengaruhi progres lesson.
Langkah berikutnya
Selesaikan bagian penting lesson ini
Lanjutkan blok wajib berikutnya: Component tidak perlu mengenal semua detail response API.