Komponen Generik & Tipe Utilitas
Tulis komponen generik yang dapat digunakan ulang dan gunakan PropsWithChildren, ComponentProps, serta Omit.
Komponen Generik & Tipe Utilitas adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar React Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus React Academy mencakup 4 pelajaran total.
Mengapa Komponen Generik?
Komponen generik beradaptasi dengan berbagai tipe data sambil tetap sepenuhnya aman secara tipe—daftar, pilihan, atau tabel bertipe yang berfungsi dengan bentuk data apa pun.
Daftar Generik Sederhana
Gunakan parameter tipe T pada fungsi untuk membuat komponen daftar yang menampilkan jenis butir apa pun.
interface ListProps<T> {
items: T[];
renderItem: (item: T, index: number) => React.ReactNode;
keyExtractor: (item: T) => string;
}
function List<T>({ items, renderItem, keyExtractor }: ListProps<T>) {
return (
<ul>
{items.map((item, i) => (
<li key={keyExtractor(item)}>{renderItem(item, i)}</li>
))}
</ul>
);
}Membatasi Tipe Generik
Gunakan extends untuk menambahkan batasan agar TypeScript mengetahui properti yang harus dimiliki tipe tersebut.
interface SelectProps<T extends { id: string; label: string }> {
options: T[];
value: T | null;
onChange: (option: T) => void;
}
function Select<T extends { id: string; label: string }>(
{ options, value, onChange }: SelectProps<T>
) {
return (
<select value={value?.id} onChange={e => onChange(options.find(o => o.id === e.target.value)!)}>
{options.map(o => <option key={o.id} value={o.id}>{o.label}</option>)}
</select>
);
}PropsWithChildren
React.PropsWithChildren<P> menambahkan children?: React.ReactNode ke tipe properti apa pun—berguna untuk komponen pembungkus.
function Card({ title, children }: React.PropsWithChildren<{ title: string }>) {
return (
<div className="card">
<h2>{title}</h2>
{children}
</div>
);
}ComponentProps
React.ComponentProps<typeof Component> mengekstrak properti dari komponen yang sudah ada, berguna ketika Anda ingin memperluas atau membungkusnya.
import { Button } from './Button';
type ExtendedButtonProps = React.ComponentProps<typeof Button> & {
loading?: boolean;
};
function LoadingButton({ loading, children, ...props }: ExtendedButtonProps) {
return (
<Button {...props} disabled={loading || props.disabled}>
{loading ? <Spinner /> : children}
</Button>
);
}ComponentPropsWithoutRef
React.ComponentPropsWithoutRef<'input'> mengekstrak properti elemen HTML tanpa properti ref—ideal untuk membungkus elemen HTML.
type InputProps = React.ComponentPropsWithoutRef<'input'> & {
label: string;
error?: string;
};
function FormInput({ label, error, ...inputProps }: InputProps) {
return (
<div>
<label>{label}</label>
<input {...inputProps} />
{error && <span className="error">{error}</span>}
</div>
);
}Menghapus & Memilih
Gunakan Omit<T, Keys> untuk menghapus properti tertentu dan Pick<T, Keys> untuk mempertahankan hanya properti tertentu dari tipe yang sudah ada.
interface UserCardProps {
id: string;
name: string;
email: string;
avatar: string;
role: string;
}
// Only expose non-sensitive fields:
type PublicUserCardProps = Omit<UserCardProps, 'email' | 'role'>;
// Or pick exactly what you need:
type AvatarProps = Pick<UserCardProps, 'name' | 'avatar'>;Sebagian & Wajib
Partial<T> menjadikan semua properti opsional (berguna untuk formulir pembaruan). Required<T> menjadikan semua properti wajib.
interface UserFormData { name: string; email: string; bio: string; }
// For update: only send changed fields
type UserUpdatePayload = Partial<UserFormData>;
// For create: all fields are mandatory
type UserCreatePayload = Required<UserFormData>;Pemetaan untuk Kamus Bertipe
Record<Keys, Value> membuat tipe objek dengan tipe kunci tertentu, berguna untuk peta pencarian dan terjemahan.
type Status = 'idle' | 'loading' | 'success' | 'error';
const statusLabels: Record<Status, string> = {
idle: 'Ready',
loading: 'Loading...',
success: 'Done!',
error: 'Something went wrong',
};ReturnType untuk Tipe Pengait
Gunakan ReturnType<typeof useMyHook> untuk menyimpulkan tipe pengembalian pengait khusus tanpa menggandakan tipe secara manual.
function useCounter(initial: number) {
const [count, setCount] = useState(initial);
return { count, increment: () => setCount(c => c + 1) };
}
type CounterHook = ReturnType<typeof useCounter>;
// { count: number; increment: () => void }Komponen Tabel Generik
Tabel data yang sepenuhnya aman secara tipe, berfungsi dengan bentuk baris apa pun, menyimpulkan kunci kolom, dan tetap menyediakan pelengkapan otomatis.
interface Column<T> {
key: keyof T;
header: string;
render?: (value: T[keyof T], row: T) => React.ReactNode;
}
function DataTable<T extends object>({ data, columns }: { data: T[]; columns: Column<T>[] }) {
return (
<table>
<thead><tr>{columns.map(c => <th key={String(c.key)}>{c.header}</th>)}</tr></thead>
<tbody>{data.map((row, i) => (
<tr key={i}>{columns.map(c => <td key={String(c.key)}>{c.render ? c.render(row[c.key], row) : String(row[c.key])}</td>)}</tr>
))}</tbody>
</table>
);
}Pemeriksaan Cepat
Tipe utilitas mana yang menghapus kunci yang ditentukan dari antarmuka TypeScript yang sudah ada?
Ringkasan
Komponen generik menggunakan parameter tipe agar tetap aman secara tipe pada berbagai bentuk data. Tipe utilitas seperti Omit, Pick, Partial, ComponentProps, dan PropsWithChildren menghilangkan penggandaan tipe secara manual dan membuat API komponen lebih mudah dikomposisikan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Komponen Generik & Tipe Utilitas” gratis?
Ya — teks lengkap “Komponen Generik & Tipe Utilitas” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus React Academy, upgrade ke CoddyKit PRO. Kursus React Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Komponen Generik & Tipe Utilitas”?
Tulis komponen generik yang dapat digunakan ulang dan gunakan PropsWithChildren, ComponentProps, serta Omit. Kamu berlatih React Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai React Academy?
Tidak diperlukan pengalaman sebelumnya. React Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Komponen Generik & Tipe Utilitas” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran React Academy ini?
Ya. Setiap pelajaran React Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menentukan Tipe Props & Nilai Kembalian Komponen
- Menentukan Tipe Event & Ref dalam TypeScript
- Komponen Generik & Tipe Utilitas
- Menentukan Tipe Context & Hook Kustom