TypeScript + React 实战
TypeScript 为 React 开发提供完整的类型支持,提高代码可靠性。

使用 TypeScript 可以让 React 组件、Props、State 等都有完整的类型检查,减少运行时错误。
React 教程查看:https://www.runoob.com/vue3/react-tutorial.html
为什么需要在 React 中使用 TypeScript
React 组件化开发会产生大量的 Props、State、Context 等数据流。
没有类型定义时,很难追踪数据的来源和结构,容易出现运行时错误。
TypeScript 给 React 补上了一整套清晰的类型系统:组件的 Props 可以做类型校验,useState 能自动推断类型,事件处理时也会有明确的类型提示。
数据流:在 React 里,不管是 Props、State,还是 Context,这几条核心数据通道都离不开清晰的类型定义;而 TypeScript 的价值就在这里,它能把数据流的类型安全稳稳兜住。
创建项目
使用现代脚手架创建支持 TypeScript 的 React 项目。
初始化
# 使用 Create React App(较慢但完整)
npx create-react-app my-app --template typescript
# 或使用 Vite(推荐,更快)
npm create vite@latest my-app -- --template react-ts
推荐:Vite 是目前最推荐的 React 构建工具,速度快,开发体验好。
组件类型
使用 React.FC 类型定义函数组件。
src/components/Button.tsx
import React from "react";
// 定义按钮组件的 Props 类型
interface ButtonProps {
text: string; // 按钮文字(必填)
onClick: () => void; // 点击回调(必填)
disabled?: boolean; // 是否禁用(可选,默认 false)
variant?: "primary" | "secondary"; // 按钮变体(可选)
}
// 使用 React.FC 定义函数组件类型
const Button: React.FC = ({
text,
onClick,
disabled = false,
variant = "primary"
}) => {
return (
);
};
export default Button;
运行结果:
Button 组件渲染成功
React.FC:这是 React 函数组件的类型,包含了 children、propTypes 等内置类型。
Props 类型
定义组件的 Props 接口,传递数据给子组件。
src/components/UserCard.tsx
import React from "react";
// 定义用户类型
interface User {
id: number; // 用户 ID
name: string; // 用户名
email: string; // 邮箱
a vatar?: string; // 头像(可选)
}
// 定义用户卡片组件的 Props
interface UserCardProps {
user: User; // 用户对象(必填)
onEdit: (user: User) => void; // 编辑回调
onDelete: (id: number) => void; // 删除回调
}
const UserCard: React.FC = ({ user, onEdit, onDelete }) => {
return (
{user.a vatar &&
}
{user.name}
{user.email}
);
};
export default UserCard;
类型传递:通过 Props 传递类型,确保整个组件树的数据类型一致。
useState 类型
为 useState 提供类型参数,确保状态类型正确。
src/components/Counter.tsx
import React, { useState } from "react";
const Counter: React.FC = () => {
// 基础类型:显式指定 number 类型
const [count, setCount] = useState(0);
// 对象类型:指定对象类型
const [user, setUser] = useState({
name: "Alice",
age: 25
});
return (
计数: {count}
用户: {user.name}, {user.age}
);
};
export default Counter;
运行结果:
Counter 组件渲染成功
泛型参数:useState
中的 T 就是状态的类型,如果提供初始值,TypeScript 可以自动推断。
useEffect 类型
useEffect 同样有完整的类型支持。
src/components/DataFetcher.tsx
import React, { useState, useEffect } from "react";
// 定义用户类型
interface User {
id: number;
name: string;
}
const DataFetcher: React.FC = () => {
// 用户列表状态
const [users, setUsers] = useState([]);
// 加载状态
const [loading, setLoading] = useState(true);
// 错误状态
const [error, setError] = useState(null);
useEffect(() => {
// 模拟获取数据
fetch("/api/users")
.then(res => res.json())
.then(data => {
setUsers(data);
setLoading(false);
})
.catch(err => {
setError(err.message);
setLoading(false);
});
}, []); // 空依赖数组:只在组件挂载时执行一次
if (loading) return 加载中...;
if (error) return 错误: {error};
return (
{users.map(user => (
- {user.name}
))}
);
};
export default DataFetcher;
依赖数组:useEffect 的第二个参数是依赖数组,TypeScript 会检查回调中使用的变量是否都已在数组中声明。
事件处理
React 事件有专门的类型定义。
src/components/Form.tsx
import React, { useState } from "react";
const Form: React.FC = () => {
// 字符串类型的状态
const [name, setName] = useState("");
// 表单提交事件处理
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault(); // 阻止表单默认提交
console.log("提交:", name);
};
// 输入框变化事件处理
const handleChange = (e: React.ChangeEvent) => {
setName(e.target.value);
};
return (
);
};
export default Form;
运行结果:
Form 组件渲染成功
事件类型:React 为每种 DOM 事件都提供了类型,如 FormEvent、ChangeEvent、MouseEvent 等。
注意事项
- React.FC:推荐使用,可获得完整的类型支持
- Props 接口:为每个组件定义 Props 类型
- useState 泛型:复杂类型需要显式指定
- 事件类型:使用 React 提供的事件类型
最佳实践:将类型定义和组件放在同一文件,或集中管理在 types 目录。
总结
TypeScript 大幅提升了 React 开发体验。
- React.FC:React 函数组件的标准类型
- Props:使用 interface 定义组件属性
- useState:使用泛型参数指定状态类型
- useEffect:完整的类型支持
- 事件:使用 React 事件类型避免 any
建议:新项目直接使用 TypeScript,可以显著减少运行时错误。
TypeScript 元组
- 上一篇
- TypeScript 元组
- 下一篇
- TypeScript + Vue3 实战
-
- 文章 · 前端 | 5小时前 |
- CSS :has() 怎么控制选择范围避免匹配成本过高
- 210浏览 收藏
-
- 文章 · 前端 | 7小时前 |
- Web Locks API 怎么避免多个标签页重复执行任务
- 348浏览 收藏
-
- 文章 · 前端 | 10小时前 |
- Fetch 流式上传为什么需要 duplex 选项
- 270浏览 收藏
-
- 文章 · 前端 | 12小时前 | 前端 · javascript · 异步编程 · JavaScript Promise.all Array.fromAsync 异步可迭代对象 AsyncIterable for await of
- JavaScript Array.fromAsync 怎么收集异步可迭代对象
- 236浏览 收藏
-
- 文章 · 前端 | 14小时前 | html · 前端 · javascript · slot Web Components 服务端渲染 Declarative Shadow DOM shadowrootmode Shadow Root
- Declarative Shadow DOM 怎么服务端输出组件结构
- 227浏览 收藏
-
- 文章 · 前端 | 17小时前 | 前端 · 性能监控 · javascript · 前端性能 PerformanceObserver INP Long Animation Frames API LoAF 卡顿脚本
- Long Animation Frames API 怎么定位卡顿脚本
- 463浏览 收藏
-
- 文章 · 前端 | 19小时前 | html · javascript · css · html Popover API popovertarget 前端弹层
- HTML Popover API 怎么实现轻量弹层
- 444浏览 收藏
-
- 文章 · 前端 | 21小时前 | websocket · javascript · 异步编程 · JavaScript websocket AbortSignal 异步迭代器 Promise.withResolvers EventTarget
- JavaScript Promise.withResolvers 适合哪些事件桥接场景
- 431浏览 收藏
-
- 文章 · 前端 | 23小时前 | javascript · JavaScript Fetch AbortController 取消请求 AbortSignal.any AbortSignal.timeout
- JavaScript AbortSignal.any 怎么组合多个取消来源
- 174浏览 收藏
-
- 文章 · 前端 | 1天前 |
- JavaScript scheduler.yield 怎么让长任务主动让出主线程
- 255浏览 收藏
-
- 文章 · 前端 | 1天前 |
- View Transition API 怎么给跨文档导航添加过渡
- 181浏览 收藏
-
- 文章 · 前端 | 1天前 | css · CSS 自定义属性 container query
- CSS Style Container Query 怎么按自定义属性切换样式
- 440浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 338次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 395次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 389次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 355次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 179次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 智能体安全引领产业升级——国内AI安全产品市场深度分析
- 2026-08-21 501浏览
-
- CSS变量简化按钮悬停效果技巧
- 2026-05-31 501浏览
-
- JavaScript符号类型详解与应用
- 2026-05-31 501浏览
-
- HTML剪贴板复制粘贴怎么用
- 2026-05-26 501浏览

