React 与 TypeScript
TypeScript (TS) 是 React 项目开发的标准配置。它为组件提供了强大的静态类型检查,显著减少了运行时的错误。
1. 定义 Props 类型
在 React 中使用 TS,最常见的场景就是为组件定义 Props 类型。
interface MessageProps {
text: string;
important?: boolean; // 可选属性
}
function MessageBox({ text, important = false }: MessageProps) {
return (
<div style={{ color: important ? 'red' : 'black' }}>
{text}
</div>
);
}
2. useState 类型推断
TS 通常能自动推断出 useState 的类型,但对于初始值为 null 或复杂对象的场景,需要显式指定。
// 自动推断为 number
const [count, setCount] = useState(0);
// 显式指定泛型
const [user, setUser] = useState<User | null>(null);
interface User {
id: number;
name: string;
}
3. 事件对象的类型
在处理表单或点击事件时,需要指定事件对象的准确类型。
function SearchInput() {
const [query, setQuery] = useState("");
// 指定元素类型为 HTMLInputElement
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setQuery(event.target.value);
};
return (
<input type="text" value={query} onChange={handleChange} />
);
}
4. useRef 与 DOM 类型
当你使用 useRef 来引用 DOM 元素时,需要指定该元素的 TS 类型。
function AutoFocusInput() {
// 显式指定 HTMLInputElement 类型
const inputRef = useRef<HTMLInputElement>(null);
useEffect(() => {
// 首次渲染后自动聚焦
inputRef.current?.focus();
}, []);
return <input ref={inputRef} />;
}
5. 实时交互演示 (JSX 实现)
由于在线实时渲染器(Live Editor)主要支持运行 JS/JSX 代码,这里提供一个 JSX 版本的交互式组件,帮助你复习组件逻辑。
实时编辑器
function Counter() { const [count, setCount] = useState(0); return ( <div style={{ textAlign: 'center' }}> <p>当前数值: <strong>{count}</strong></p> <button onClick={() => setCount(c => c + 1)}>增加</button> <button onClick={() => setCount(c => c - 1)}>减少</button> </div> ); }
结果
Loading...
小结
- 接口 (Interface):用于定义 Props 的形状。
- 泛型 (Generics):用于
useState<T>,useRef<T>等钩子,指定精确类型。 - React.XXEvent:提供完善的事件对象类型定义。
- 编译期捕获:TS 最大的优势是在代码还没运行前就发现潜在漏洞。