网站首页 > 教程文章 正文
TSX 是 TypeScript 与 JSX 的结合,它是编写 React 组件的标准语法扩展。简单来说:
TSX = TypeScript(带类型系统的 JavaScript) + JSX(JavaScript XML)
核心概念解析:
JSX 本质
- 语法糖:允许在 JavaScript 中写类 HTML 标签(实际编译为 React.createElement())
- 示例对比:
// JSX 写法
const element = <h1 className="title">Hello TSX!</h1>
// 编译后的 JavaScript
const element = React.createElement('h1', { className: 'title' }, 'Hello TSX!')
TypeScript 加持
- 为 JSX 添加静态类型检查,在编码时捕获错误
- 提供组件 Props/State 的类型安全
tsx
interface ButtonProps {
variant: 'primary' | 'secondary'; // 明确可选值
size?: number; // 可选属性
onClick: () => void; // 函数类型定义
}
const Button = ({ variant, size = 24, onClick }: ButtonProps) => (
<button
style={{ fontSize: size }}
className={`btn-${variant}`}
onClick={onClick}
>
Click
</button>
);
为什么需要 TSX 呢?
特性 | 普通 JSX | TSX | 优势说明 |
类型检查 | 运行时可能出错 | 编码时即时报错 | 防止 undefined 访问等错误 |
组件约束 | 无 Props 约束 | 明确定义 Props 接口 | 避免错误传递无效属性 |
智能提示 | 基础提示 | 精准的代码补全 | 提高开发效率 |
重构能力 | 全局字符串替换 | 安全的类型驱动重构 | 大型项目维护更可靠 |
典型应用场景
tsx
// 带类型的安全组件
type UserCardProps = {
user: {
id: number;
name: string;
avatarUrl: string;
};
onFollow?: (userId: number) => void; // 可选回调函数
};
const UserCard = ({ user, onFollow }: UserCardProps) => (
<div className="card">
<img src={user.avatarUrl} alt={user.name} width={80} />
<h2>{user.name}</h2>
{onFollow && (
<button onClick={() => onFollow(user.id)}>
Follow
</button>
)}
</div>
);
// 使用组件时获得类型提示
<UserCard
user={{ id: 1, name: "Alice", avatarUrl: "/alice.jpg" }}
onFollow={(id) => console.log(`Followed ${id}`)}
/>
// 错误示例:缺少必要属性
// <UserCard /> // TS报错: Property 'user' is missing
编译过程
最佳实践
- 组件类型声明
tsx
// 函数组件
const Component: React.FC<Props> = ({ children }) => (...)
// 更推荐直接标注 props (避免 FC 的隐式 children)
const Component = (props: Props & { children?: ReactNode }) => (...)
- 类型复用技巧
tsx
// 继承原生元素属性
type ButtonProps = React.ComponentPropsWithoutRef<'button'> & {
variant?: 'primary' | 'outline';
};
// 复用其他组件类型
type ModalProps = Pick<DialogProps, 'size' | 'position'> & {
title: string;
};
- 泛型组件 (灵活数据处理)
tsx
interface ListProps<T> {
items: T[];
renderItem: (item: T) => React.ReactNode;
}
function List<T>({ items, renderItem }: ListProps<T>) {
return <div>{items.map(renderItem)}</div>;
}
// 使用
<List<{ id: number, text: string }>
items={data}
renderItem={(item) => <li key={item.id}>{item.text}</li>}
/>
重要提示:TSX 文件使用 .tsx 后缀(区别于普通 TypeScript 的 .ts),React 18+ 默认支持 TSX 编译。
通过 TSX,开发者能在组件重用和灵活扩展中获得类型安全保障,这正是平衡复用性与灵活性的关键技术支撑。
好了,爱学习的小伙伴,更多精彩,关注不迷路哟~
猜你喜欢
- 2025-06-18 让 React 代码行数减少78%的 htmlx 有这么神?
- 2025-06-18 如何做 React 性能优化?(react 项目优化)
- 2025-06-18 React 渲染流程可视化,有大佬实现了!
- 2025-06-18 与 Vue 相伴四年,终究还是没抵住 React 的巨大诱惑
- 2025-06-18 25、Tailwind:魔法速记术——React 19 样式新思路
- 2025-06-18 推荐!React 生态不容错过的6大顶级虚拟滚动库?
- 2025-06-18 React18 Hook中的useState和useEffect
- 2025-06-18 8.3K star!React Bits,让你拥有全网几乎所有动画效果
- 2025-06-18 前端开发React18 - useEffect(前端开发工程师是干什么的)
- 2025-06-18 react-store(react18+)-同步和异步操作仓库
- 最近发表
-
- 一课译词:一刀两断(一刀两断成语解释)
- 核心短语break up用法解析(breakd短语)
- HTML+CSS 实现商品图片列表放大视觉效果 复制完整代码即可马上调用
- 前端实现右键自定义菜单(前端实现右键自定义菜单怎么设置)
- Python中docx与docxcompose批量合并多个Word文档并添加分页符
- Java 将Excel转为XML(java将xls转换成xlsx)
- jq+ajax+bootstrap改了一个动态分页的表格
- css兼容性问题及一些常见问题汇总大全,赶快收藏!
- Java 的业务逻辑验证框架 之-fluent-validator
- 小程序cover-view踩坑系列2(微信小程序overflow)
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)