TypeScript i React
Varför TypeScript?
- Fångar fel vid utveckling (fel props, felaktiga svar från API).
- Bättre autocompletion och refaktoreringsstöd.
- Tydligare kontrakt mellan komponenter.
Props och state
// Button.tsx
type ButtonProps = {
text: string;
onClick?: () => void;
disabled?: boolean;
};
export function Button({ text, onClick, disabled = false }: ButtonProps) {
return (
<button disabled={disabled} onClick={onClick}>
{text}
</button>
);
}
Varför? Komponentens API blir själv‑dokumenterande och säkert.
Event‑typer
function Form() {
const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
};
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
console.log(e.target.value);
};
return (
<form onSubmit={onSubmit}>
<input onChange={onChange} />
<button type="submit">Skicka</button>
</form>
);
}
Hooks och generics
function useFetch<T>(url: string) {
const [data, setData] = React.useState<T | null>(null);
const [error, setError] = React.useState<string | null>(null);
React.useEffect(() => {
let active = true;
fetch(url)
.then((r) => (r.ok ? r.json() : Promise.reject(r.statusText)))
.then((json) => active && setData(json as T))
.catch((err) => active && setError(String(err)));
return () => {
active = false;
};
}, [url]);
return { data, error };
}
Gradvis införande
- Starta med att typa nya filer (
.tsx
) och centrala modeller (User, Product). - Aktivera striktare TS‑regler först när teamet är bekvämt.
- Behåll interop med JS: du kan blanda
.ts/.tsx
och.js/.jsx
i samma projekt.