当前位置: 首页 > news >正文

TypeScript 中的 JSX 详解

JSX 是一种 JavaScript 的语法扩展,允许在 JavaScript 代码中编写类似 HTML 的结构。在 TypeScript 中使用 JSX 可以获得完整的类型检查和智能提示。

1. 配置 TypeScript 支持 JSX

在 tsconfig.json 中配置 JSX 相关选项:

{"compilerOptions": {"jsx": "react-jsx",        // React 17+ 新的 JSX 转换// 或 "jsx": "react-jsxdev", // 开发模式// 或 "jsx": "preserve",     // 保留 JSX,由其他工具处理// 或 "jsx": "react",        // 传统的 React JSX 转换"jsxFactory": "React.createElement", // 自定义 JSX 工厂函数"jsxFragmentFactory": "React.Fragment" // 自定义 Fragment 工厂}
}

2. 基本 JSX 语法

2.1 元素类型

// 内置 HTML 元素
const divElement: JSX.Element = <div>Hello</div>;// 自定义组件(PascalCase)
interface ButtonProps {onClick: () => void;children: React.ReactNode;
}const Button: React.FC<ButtonProps> = ({ onClick, children }) => {return <button onClick={onClick}>{children}</button>;
};// 使用组件
const App: React.FC = () => {return (<div><Button onClick={() => console.log('Clicked!')}>Click me</Button></div>);
};

2.2 属性类型

interface ImageProps {src: string;alt: string;width?: number;height?: number;className?: string;style?: React.CSSProperties;
}const Image: React.FC<ImageProps> = (props) => {return <img {...props} />;
};// 使用
<Image src="image.jpg" alt="Description" width={100}style={{ border: '1px solid red' }}
/>

3. 类型系统

3.1 核心类型

// JSX 元素类型
const element: JSX.Element = <div />;// 组件返回类型
const Component: React.FC = (): JSX.Element => {return <div>Hello</div>;
};// 子元素类型
interface ContainerProps {children: React.ReactNode; // 最宽松的子元素类型
}// 更具体的子元素类型
interface StrictContainerProps {children: React.ReactElement | React.ReactElement[];
}// 没有子元素
interface NoChildrenProps {children?: never;
}

3.2 事件处理

interface FormProps {onSubmit: (data: FormData) => void;onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
}const Form: React.FC<FormProps> = ({ onSubmit, onChange }) => {const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {event.preventDefault();const formData = new FormData(event.currentTarget);onSubmit(formData);};return (<form onSubmit={handleSubmit}><input type="text" onChange={onChange}name="username"/><button type="submit">Submit</button></form>);
};

4. 高级模式

4.1 条件渲染

interface UserInfoProps {user: { name: string; email: string } | null;isLoading: boolean;
}const UserInfo: React.FC<UserInfoProps> = ({ user, isLoading }) => {if (isLoading) {return <div>Loading...</div>;}if (!user) {return <div>No user found</div>;}return (<div><h1>{user.name}</h1><p>{user.email}</p></div>);
};

4.2 列表渲染

interface TodoListProps {todos: Array<{id: number;text: string;completed: boolean;}>;onToggle: (id: number) => void;
}const TodoList: React.FC<TodoListProps> = ({ todos, onToggle }) => {return (<ul>{todos.map(todo => (<li key={todo.id}style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}onClick={() => onToggle(todo.id)}>{todo.text}</li>))}</ul>);
};

4.3 插槽模式

interface CardProps {title: string;header?: React.ReactNode;footer?: React.ReactNode;children: React.ReactNode;
}const Card: React.FC<CardProps> = ({ title, header, footer, children }) => {return (<div className="card">{header && <div className="card-header">{header}</div>}<div className="card-body"><h3>{title}</h3>{children}</div>{footer && <div className="card-footer">{footer}</div>}</div>);
};// 使用
<Card title="My Card" header={<button>Close</button>}footer={<span>Footer content</span>}
>Main content here
</Card>

5. 泛型组件

interface ListProps<T> {items: T[];renderItem: (item: T) => React.ReactNode;keyExtractor: (item: T) => string | number;
}function List<T>({ items, renderItem, keyExtractor }: ListProps<T>): JSX.Element {return (<div>{items.map(item => (<div key={keyExtractor(item)}>{renderItem(item)}</div>))}</div>);
}// 使用泛型组件
interface User {id: number;name: string;
}const users: User[] = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' }
];<Listitems={users}keyExtractor={user => user.id}renderItem={user => <span>{user.name}</span>}
/>

6. 上下文(Context)与类型

interface Theme {mode: 'light' | 'dark';colors: {primary: string;background: string;};
}// 创建带类型的 Context
const ThemeContext = React.createContext<Theme | undefined>(undefined);interface ThemeProviderProps {theme: Theme;children: React.ReactNode;
}const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {return (<ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>);
};// 自定义 Hook 用于消费 Context
const useTheme = (): Theme => {const theme = React.useContext(ThemeContext);if (!theme) {throw new Error('useTheme must be used within ThemeProvider');}return theme;
};

7. 高阶组件(HOC)

// 注入 props 的高阶组件
interface WithLoadingProps {isLoading: boolean;
}function withLoading<P extends object>(Component: React.ComponentType<P>
): React.FC<P & WithLoadingProps> {return ({ isLoading, ...props }: P & WithLoadingProps) => {if (isLoading) {return <div>Loading...</div>;}return <Component {...props as P} />;};
}// 使用
interface UserProfileProps {user: { name: string };
}const UserProfile: React.FC<UserProfileProps> = ({ user }) => {return <div>{user.name}</div>;
};const UserProfileWithLoading = withLoading(UserProfile);

8. 最佳实践

8.1 组件定义方式

// 1. Function Component with React.FC
const Component1: React.FC<Props> = (props) => { /* ... */ };// 2. 直接定义函数(推荐,更灵活)
function Component2(props: Props): JSX.Element { /* ... */ }// 3. 使用 PropsWithChildren(如果需要 children)
type Component3Props = React.PropsWithChildren<{title: string;
}>;const Component3: React.FC<Component3Props> = ({ title, children }) => {return (<div><h1>{title}</h1>{children}</div>);
};

8.2 事件处理类型

// 正确的类型定义
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {event.preventDefault();// 处理点击
};const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {console.log(event.target.value);
};const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {event.preventDefault();// 处理提交
};

8.3 样式类型

// CSS Properties 类型安全
const styles: React.CSSProperties = {display: 'flex',justifyContent: 'center',alignItems: 'center',backgroundColor: 'white', // 自动补全和类型检查
};// 使用
<div style={styles}>Content</div>

这些是 TypeScript 中 JSX 的核心概念和最佳实践。通过类型系统的支持,可以在开发过程中获得更好的代码提示、错误检测和重构能力。

http://www.dtcms.com/a/438198.html

相关文章:

  • Codesys如何读取轴的当前控制模式
  • 高性能网站建设指南 京东模拟网站开发
  • 一元购网站建设教育类网站策划书
  • 2025 AI 落地全景:从技术热潮到产业重构
  • 解析动态数据:如何抓取 JavaScript 加载的 AJAX 内容
  • 聚焦技术落地,展现 AI 重构产业的实践路径。
  • 番禺网站(建设信科网络)小卖部做网站
  • 【氮化镓】P-GaN:提高高温栅极寿命的解决方案
  • 商洛做网站多少钱珠海网站制作哪家便宜
  • 唐山中企动力做网站用php做电子商务网站
  • 05_Pandas数据结构
  • OSPF协议详解3:网络类型、SPF算法、路由选择与特殊区域
  • 10.3总结
  • 算法比赛中的浮点数精度陷阱:从一个货币分解问题说起
  • 昆明手机网站开发不到网站是为什么
  • 反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
  • 爬坑 10 年!京东店铺全量商品接口实战开发:从分页优化、SKU 关联到数据完整性闭环
  • LeetCode每日一题——判断能否形成等差数列
  • springboot整合sa-token报未能获取有效的上下文处理器
  • 和别人做网站接单赚钱企业网站开发技术期末试题
  • AI-调查研究-93-具身智能 机器人仿真工具大全:从Gazebo到Isaac Sim的全面对比 六大仿真平台
  • 【计算机视觉】霍夫变换检测
  • 【Java核心技术/基础】25道Java核心技术基础面试题及答案
  • AI伦理困局:算法时代的公平与治理之道
  • 网站及app开发招聘榆中县城乡建设局网站
  • MySQL的MHA高可用集群解决方案应用实战(上)
  • 廊坊专业网站网站网站的制作建站人
  • list 实现链表封装节点的底层逻辑:如何克服不连续无法正常访问挑战
  • flash网站模板福州网络推广专员
  • tcpxtract安装教程