0Pricing
React Academy · Pelajaran

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

  1. Menentukan Tipe Props & Nilai Kembalian Komponen
  2. Menentukan Tipe Event & Ref dalam TypeScript
  3. Komponen Generik & Tipe Utilitas
  4. Menentukan Tipe Context & Hook Kustom
← Kembali ke React Academy