TypeScript untuk React
Props, state, event handler, dan ref yang bertipe penuh di komponen React.
Props dengan Interface
Setiap komponen mendefinisikan kontrak props-nya:
interface TombolProps {
label: string;
varian?: "primer" | "sekunder";
onKlik: () => void;
}
function Tombol({ label, varian = "primer", onKlik }: TombolProps) {
return <button onClick={onKlik} className={varian}>{label}</button>;
}
// pemakaian:
<Tombol label="Simpan" onKlik={() => simpan()} /> // ok
<Tombol label="Simpan" /> // Error: onKlik wajib
<Tombol label="Simpan" onKlik={() => {}} varian="besar" /> // Error: "besar" bukan varianTypo nama prop atau prop wajib yang lupa dikirim ketahuan saat kompilasi, bukan sebagai komponen yang render-nya rusak diam-diam.
State Bertipe
const [nama, setNama] = useState(""); // string, ter-infer otomatis
const [umur, setUmur] = useState<number | null>(null); // butuh annotation eksplisit
const [pengguna, setPengguna] = useState<Pengguna | null>(null);useState("") ter-infer sebagai string. Tapi useState(null) butuh generic eksplisit, kalau tidak tipenya terkunci null selamanya dan setPengguna(obj) error.
Event Handler
function Form() {
const handleUbah = (e: React.ChangeEvent<HTMLInputElement>) => {
console.log(e.target.value); // string, aman
};
const handleKirim = (e: React.FormEvent) => {
e.preventDefault();
};
return (
<form onSubmit={handleKirim}>
<input onChange={handleUbah} />
</form>
);
}Tipe event React (ChangeEvent, FormEvent, MouseEvent) memberi tahu bentuk e.target secara presisi. Salah ketik e.target.valu langsung error.
Ref Bertipe
const inputRef = useRef<HTMLInputElement>(null);
function fokus() {
inputRef.current?.focus(); // ?. karena current bisa null
}Generic useRef<HTMLInputElement> memastikan current punya method DOM yang benar. Optional chaining wajib karena ref awalnya null.
Catatan teknis: Hindari
React.FCuntuk komponen baru kecuali butuh sesuatu yang spesifik darinya.React.FCotomatis menambahkan propchildren(sering tidak diinginkan) dan perilakunya berubah antar versi @types/react. Destructuring props dengan interface biasa seperti contoh di atas lebih eksplisit dan bebas kejutan.