Skip to content

React + TypeScript

React + TypeScript เป็นมาตรฐานของ frontend development — ได้ทั้ง component type safety และ autocomplete ที่ยอดเยี่ยม

// กำหนด Props interface
interface ButtonProps {
label: string;
variant: "primary" | "secondary" | "danger";
size?: "sm" | "md" | "lg"; // optional
disabled?: boolean;
onClick: () => void;
}
// Function component ด้วย props type
function Button({ label, variant, size = "md", disabled, onClick }: ButtonProps) {
return (
<button
className={`btn btn-${variant} btn-${size}`}
disabled={disabled}
onClick={onClick}
>
{label}
</button>
);
}
// ReactNode สำหรับ children ที่เป็นอะไรก็ได้
interface CardProps {
title: string;
children: React.ReactNode;
footer?: React.ReactNode;
}
function Card({ title, children, footer }: CardProps) {
return (
<div className="card">
<h2>{title}</h2>
<div className="card-body">{children}</div>
{footer && <div className="card-footer">{footer}</div>}
</div>
);
}
import { useState } from "react";
interface User {
id: number;
name: string;
email: string;
}
function UserProfile() {
// TS infer type จาก initial value
const [count, setCount] = useState(0); // number
// ระบุ type เมื่อ initial value ไม่เพียงพอ
const [user, setUser] = useState<User | null>(null);
const [errors, setErrors] = useState<string[]>([]);
const handleLoad = async () => {
const data: User = { id: 1, name: "สมชาย", email: "s@test.com" };
setUser(data); // type-safe!
};
return (
<div>
{user ? <p>{user.name}</p> : <p>Loading...</p>}
<button onClick={handleLoad}>Load User</button>
</div>
);
}
function SearchForm() {
const [query, setQuery] = useState("");
// React.ChangeEvent สำหรับ input onChange
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setQuery(e.target.value);
};
// React.FormEvent สำหรับ form onSubmit
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
console.log("Search:", query);
};
// React.MouseEvent สำหรับ onClick
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
console.log("Clicked at:", e.clientX, e.clientY);
};
return (
<form onSubmit={handleSubmit}>
<input value={query} onChange={handleChange} />
<button type="submit" onClick={handleClick}>ค้นหา</button>
</form>
);
}
// Component ที่ทำงานกับหลาย data types
interface ListProps<T> {
items: T[];
renderItem: (item: T) => React.ReactNode;
keyExtractor: (item: T) => string;
}
function List<T>({ items, renderItem, keyExtractor }: ListProps<T>) {
return (
<ul>
{items.map(item => (
<li key={keyExtractor(item)}>{renderItem(item)}</li>
))}
</ul>
);
}
// ใช้งาน — TS infer type T จาก items
<List
items={[{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }]}
renderItem={(user) => <span>{user.name}</span>}
keyExtractor={(user) => String(user.id)}
/>