Typed React Props dan Component Generics di TypeScript
Definisi
Menulis komponen React dengan tipe props eksplisit (Props) dan generics saat komponen bekerja dengan data apa pun (list, select, table). Tujuannya autocomplete + keamanan tanpa any.
Kapan dipakai
Pakai saat komponen reusable (Table, List, Select) yang tipe datanya ditentukan caller. Tanpa generics, caller kehilangan tipe item di renderRow, onChange, dll.
Cara kerja
Props biasa
type ButtonProps = {
variant?: 'primary' | 'ghost';
children: React.ReactNode;
onClick?: () => void;
};
function Button({ variant = 'primary', children, onClick }: ButtonProps) {
return <button className={variant} onClick={onClick}>{children}</button>;
}Generic component
function List<T>({ items, render }: { items: T[]; render: (it: T) => React.ReactNode }) {
return <ul>{items.map((it, i) => <li key={i}>{render(it)}</li>)}</ul>;
}
<List items={['a', 'b']} render={(s) => s.toUpperCase()} />; // s: stringPolymorphic (lanjut)
type Props<C extends keyof JSX.IntrinsicElements> = {
as?: C;
} & JSX.IntrinsicElements[C];Struktur alur
Loading diagram...
Catatan implementasi
- Untuk
forwardRef+ generic, tipe agak verbose; di React 19refjadi prop menyederhanakan. React.FCsudah jarang disarankan; cukup function denganProps.- Polymorphic component powerful tapi rumit; pastikan benar-benar perlu.
keywajib di list; jangan gunakan index bila urutannya berubah.
Kesalahan umum
- any di props: kehilangan safety; gunakan union/explicit.
- Generic tidak infer: caller harus
<T>eksplisit kalau tidak ada argumen penuntun. - Lupa children type:
React.ReactNodelebih aman dariany. - Over-polymorphic: terlalu fleksibel jadi sulit dipakai.