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

如何在 React 项目中应用 TypeScript?应该注意那些点?结合实际项目示例及代码进行讲解!

在 React 项目中应用 TypeScript 是提升开发效率、增强代码可维护性和可读性的好方法。TypeScript 提供了静态类型检查、自动补全和代码提示等功能,这对于 React 开发者来说,能够帮助早期发现潜在的 bug,提高开发体验。

1. 项目初始化

在现有的 React 项目中添加 TypeScript 或者在新项目中使用 TypeScript,最常见的两种方式:

1.1 使用 create-react-app 创建 TypeScript 项目

create-react-app 提供了一个简单的方式来初始化一个支持 TypeScript 的 React 项目。

npx create-react-app my-app --template typescript

这会生成一个默认的 React 项目,且已包含 TypeScript 配置。

1.2 在现有项目中添加 TypeScript

如果你已经有一个基于 JavaScript 的 React 项目,可以通过以下步骤将 TypeScript 添加到现有项目中:

  1. 安装 TypeScript 和类型声明文件:
npm install typescript @types/react @types/react-dom @types/jest --save-dev
  1. 在项目根目录下添加一个 tsconfig.json 文件。可以通过以下命令生成:
npx tsc --init
  1. .js 文件重命名为 .tsx(如果文件中包含 JSX)或 .ts(如果没有 JSX)。

2. TypeScript 与 React 组件

在 React 中,组件的类型定义通常是使用接口(interface)或者类型别名(type)来定义 props 和 state。通过这些方式,TypeScript 可以帮助你在编写组件时验证 props 和 state 的类型。

2.1 函数组件的类型定义
import React from 'react';// 定义一个组件的 props 类型
interface MyComponentProps {name: string;age?: number; // 可选属性
}// 函数组件的定义
const MyComponent: React.FC<MyComponentProps> = ({ name, age }) => {return (<div><h1>Hello, {name}!</h1>{age && <p>Age: {age}</p>}</div>);
}export default MyComponent;

解析:

  • MyComponentProps 接口定义了组件的 props 类型。
  • React.FC<MyComponentProps> 表示该组件是一个函数组件,并且它接受 MyComponentProps 类型的 props
  • age? 是一个可选的属性,如果没有传递 age,TypeScript 会自动推断它是 undefined
2.2 类组件的类型定义

如果你使用类组件,你也可以使用 TypeScript 来定义 propsstate 类型:

import React, { Component } from 'react';interface MyComponentProps {name: string;
}interface MyComponentState {count: number;
}class MyComponent extends Component<MyComponentProps, MyComponentState> {constructor(props: MyComponentProps) {super(props);this.state = { count: 0 };}increment = () => {this.setState({ count: this.state.count + 1 });}render() {const { name } = this.props;const { count } = this.state;return (<div><h1>Hello, {name}!</h1><p>Count: {count}</p><button onClick={this.increment}>Increment</button></div>);}
}export default MyComponent;

解析:

  • MyComponentProps 定义了 props 的类型。
  • MyComponentState 定义了组件的 state 类型。
  • 在类组件中,Component 接受两个泛型参数,第一个是 props 的类型,第二个是 state 的类型。

3. State 和事件类型

TypeScript 也会帮助你类型化组件中的 state 和事件处理函数。

3.1 使用 useState 钩子

useState 是 React 中的一个常用钩子。为了让 TypeScript 知道 state 的类型,你可以显式指定 useState 的类型:

import React, { useState } from 'react';const Counter: React.FC = () => {const [count, setCount] = useState<number>(0); // 显式指定类型const increment = () => setCount(count + 1);const decrement = () => setCount(count - 1);return (<div><p>Count: {count}</p><button onClick={increment}>Increment</button><button onClick={decrement}>Decrement</button></div>);
};export default Counter;

解析:

  • useState<number>(0) 显式指定 statenumber 类型,TypeScript 会确保 count 变量是一个数字。
  • 这样可以避免在 setCount 中传递非数字类型的值。
3.2 使用事件类型

对于 React 中的事件处理函数,TypeScript 提供了详细的类型定义。你可以通过类型注解来确保事件对象的正确性。

import React from 'react';const MyButton: React.FC = () => {const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {console.log('Button clicked', event);};return <button onClick={handleClick}>Click Me</button>;
};export default MyButton;

解析:

  • handleClick 函数的 event 参数被类型化为 React.MouseEvent<HTMLButtonElement>,它确保事件对象是一个鼠标点击事件,并且目标是一个按钮元素。

4. 类型定义文件(@types)

对于一些第三方库,TypeScript 需要通过类型声明文件来理解它们的类型。大多数流行的 React 库,如 react-router, axios 等,都提供了类型定义文件(@types)。

例如,使用 axios 时,安装相关的类型声明:

npm install axios @types/axios

安装后,TypeScript 会自动识别 axios 的类型定义。

5. TypeScript 和 JSX

如果你的组件中有 JSX,你需要确保 .tsx 文件的类型正确。如果没有 JSX,那么你只需要使用 .ts 文件。

5.1 类型检查 JSX 元素

你可以通过 TypeScript 对 JSX 元素进行类型检查。确保你的组件接受的 props 和传递的元素都符合预期的类型。

import React from 'react';interface BoxProps {color: 'red' | 'blue' | 'green'; // 限定 color 为特定值
}const Box: React.FC<BoxProps> = ({ color }) => {return <div style={{ backgroundColor: color }}>I am a {color} box</div>;
};export default Box;

解析:

  • color 属性只允许 'red', 'blue', 或 'green',TypeScript 会在编译时检查传递给组件的值是否在这些选项之内。

6. React 与 TypeScript 使用中的注意点

  1. 避免 any 类型:尽量避免使用 any 类型。虽然 any 可以绕过 TypeScript 的类型检查,但它会失去类型安全的意义。尽量使用更具体的类型或者类型推导。
  2. 使用 React.FC 时的警告React.FC 是 React 提供的函数组件类型定义,虽然它可以简化类型声明,但它也有一些限制,如自动推断 children,有时会引起不必要的困扰。在某些情况下,可以使用自定义接口代替。
  3. Props 和 State 类型:对于复杂的 props 和 state,使用接口(interface)定义类型会更加清晰。对于简单的类型,可以使用类型别名(type)。
  4. 类型推导:TypeScript 在大多数情况下能够自动推导变量的类型,因此尽量依赖 TypeScript 的推导,而不是显式类型声明,只有在需要明确类型时才指定类型。

总结

在 React 项目中使用 TypeScript 能够显著提高代码的可读性和可维护性。通过合理地使用 TypeScript 的类型系统,能在编译时捕获错误,减少运行时 bug。类型检查不仅可以提高代码的健壮性,还能帮助开发者更好地理解组件的期望输入和输出。

在实际项目中,你应该:

  • 明确地定义每个组件的 propsstate 类型。
  • 在函数和事件处理器中使用合适的类型注解。
  • 尽量避免使用 any 类型,尽可能让 TypeScript 进行类型推导。
  • 使用 TypeScript 对第三方库和框架进行类型管理,以提高开发效率。

相关文章:

如何在 React 项目中应用 TypeScript?应该注意那些点?结合实际项目示例及代码进行讲解!

在 React 项目中应用 TypeScript 是提升开发效率、增强代码可维护性和可读性的好方法。TypeScript 提供了静态类型检查、自动补全和代码提示等功能&#xff0c;这对于 React 开发者来说&#xff0c;能够帮助早期发现潜在的 bug&#xff0c;提高开发体验。 1. 项目初始化 在现…...

C++学习第四天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、计算类对象的大小 #include<iostream> using namespace std;class Date { public:void Init(int year, in…...

【从零开始的LeetCode-算法】3232. 判断是否可以赢得数字游戏

给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中&#xff0c;Alice 可以从 nums 中选择所有个位数 或 所有两位数&#xff0c;剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和&#xff0c;则 Alice 获胜。 如果 Alice 能赢得这场游…...

一种简单高效的RTSP流在线检测方法,不需要再过渡拉流就可以获取设备状态以及对应音视频通道与编码格式

平台如何检测一路RTSP流是否在线&#xff1f; 在之前的流媒体平台方案中&#xff0c;我们都是通过定时RTSP拉流的方式&#xff0c;走一个完整的RTSP流程&#xff1a;包括OPTIONS、DESCRIBE、SETUP、PLAY、RTP收流&#xff0c;这种方式去取流&#xff0c;然后取到流之后进行流解…...

24/11/22 项目拆解 艺术风格转移

我们有时候想把两种艺术风格整合&#xff0c;创造更具艺术特色的艺术品&#xff0c;人很难办到&#xff0c;但是人工智能可以,比如下面将艺术画的风格转移到照片上。 我们先来初步了解一下实现上述功能的数学原理 所谓艺术风格&#xff0c;其实就是边缘&#xff0c;颜色&#…...

数字赋能,气象引领 | 气象景观数字化服务平台重塑京城旅游生态

在数字化转型的浪潮中&#xff0c;旅游行业正以前所未有的速度重塑自身&#xff0c;人民群众对于高品质、个性化旅游服务需求的日益增长&#xff0c;迎着新时代的挑战与机遇&#xff0c;为开展北京地区特色气象景观预报&#xff0c;打造“生态气象旅游”新业态&#xff0c;助推…...

关于Redux的学习(包括Redux-toolkit中间件)

目录 什么是 Redux &#xff1f; 我为什么要用 Redux &#xff1f; 我什么时候应该用 Redux &#xff1f; Redux 库和工具 React-Redux Redux Toolkit Redux DevTools 拓展 一个redux小示例 代码示例(很有用)&#xff1a; Redux 术语 Actions Reducers Store Dis…...

【无人机】

GJI Mini 4 Pro学习 首次飞行使用 01 开箱 打开长飞套装 依次取出产品及配件 飞行器、DJI RC - N2&#xff08;DJI RC 2&#xff09;、桨叶/螺丝、云台保护罩、束桨器、电池、螺丝刀、USB-C快接线、单肩包、USB-C数据线、充电管家 02 准备飞行器 取下束桨器&#xff0c;…...

Zabbix7.0.6的容器镜像准备

准备Zabbix7.0.6部署所需的容器镜像。 更新时间&#xff1a;20241122 一、准备数据库镜像 1、核对版本支持 根据Zabbix官网文档requirements 可知&#xff0c;当前最新的Zabbix 7.0.6对PostgreSQL数据库的要求如下&#xff1a; support for PostgreSQL versions:- 17.X …...

利用 GitHub 和 Hexo 搭建个人博客【保姆教程】

利用 GitHub 和 Hexo 搭建个人博客 利用 GitHub 和 Hexo 搭建个人博客一、前言二、准备工作&#xff08;一&#xff09;安装 Node.js 和 Git&#xff08;二&#xff09;注册 GitHub 账号 三、安装 Hexo&#xff08;一&#xff09;创建博客目录&#xff08;二&#xff09;安装 H…...

React第四节 组件的三大属性之state

前言 状态 state适用于类式组件中&#xff0c;而再函数式组件中需要使用 useState HOOK 模拟状态; React的组件就是一个状态机&#xff0c;通过与用户的交互&#xff0c;实现不同的状态&#xff0c;根据不同的状态展现出不一样的UI视图 并不是组件中所有的属性 都是组件的状态…...

MongoDB进阶篇-索引(索引概述、索引的类型、索引相关操作、索引的使用)

文章目录 1. 索引概述2. 索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引2.3.1 地理空间索引&#xff08;Geospatial Index&#xff09;2.3.2 文本索引&#xff08;Text Indexes&#xff09;2.3.3 哈希索引&#xff08;Hashed Indexes&#xff09; 3. 索引相关操作3.1 查看索…...

使用FFmpeg实现视频与GIF的画中画效果

用FFmpeg命令行工具将GIF动画作为画中画&#xff08;Picture-in-Picture&#xff0c;简称PiP&#xff09;叠加到视频上。FFmpeg是一个强大的多媒体框架&#xff0c;能够处理几乎所有格式的音频和视频文件。通过这个教程&#xff0c;你将学会如何将一个小的GIF动画循环播放&…...

车载信息安全框架 --- 车载信息安全相关事宜

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…...

Unreal5从入门到精通之EnhancedInput增强输入系统详解

前言 从Unreal5开始,老版的输入系统,正式替换为EnhancedInput增强型输入系统,他们之间有什么区别呢? 如果有使用过Unity的同学,大概也知道,Unity也在2020版本之后逐渐把输入系统也升级成了新版输入系统,为什么Unreal和Unity都热衷于升级输入系统呢?这之间又有什么联系…...

泛微E9与金蝶云星空的集成方案:实现审批流程与财务管理的无缝对接

泛微E9与金蝶云星空的集成方案&#xff1a;实现审批流程与财务管理的无缝对接 背景介绍&#xff1a; 在企业日常运营中&#xff0c;泛微OA-E9和金蝶云星空是两个关键的系统。泛微OA-E9是一款广受企业青睐的办公自动化软件&#xff0c;它通过流程管理、文档管理、协同办公等模…...

理解设计模式与 UML 类图:构建稳健软件架构的基石

在软件开发的广阔天地里&#xff0c;设计模式与 UML&#xff08;统一建模语言&#xff09;类图犹如两座灯塔&#xff0c;为开发者照亮前行的道路&#xff0c;指引着我们构建出高质量、可维护且易于扩展的软件系统。今天&#xff0c;就让我们一同深入探索单一职责、开闭原则、简…...

FastAPI重载不生效?解决PyCharm中Uvicorn无法重载/重载缓慢的终极方法!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 重载缓慢 📒📝 问题概述🚨 相关原因📝 解决方案一📝 解决方案二📝 解决方案三📝 解决方案四⚓️ 相关链接 ⚓️📖 介绍 📖 在使用FastAPI开发时,reload=True 本应让你在修改代码后自动重启服务,提升开发效率…...

最新子比主题zibll8.0开心版源码 无加密无后门

Zibll子比主题专为博客、自媒体及资讯类网站精心打造&#xff0c;以其简约而不失高雅的设计风格&#xff0c;为网站增添独特魅力与视觉美感。 8.0更新内容: 新增发帖选择板块、话题、标签时支持搜索&#xff0c;同时优化了选择栏目&#xff0c;更加方便快捷 新增小工具文章列表…...

【数据分析】认清、明确

1、什么是数据分析。 - 通过对大量的数据进行科学的分析。 - 得出结论&#xff0c;提出建议&#xff0c;辅助公司企业的决策。2、数据分析分为几步。 - 1.明确目的! - 2.收集数据!自己的数据! 自动化采集的数据! - 3.数据处理! - 4.数据分析!数据分析(业务)数据挖掘(代码算法…...

无机布防火卷帘门报价透明,包工包料,一次说清所有费用

很多客户在选购无机布防火卷帘门时&#xff0c;最关心实际成交价格&#xff0c;也担心报价不清晰&#xff0c;后期产生各类额外支出。行业内产品定价参差不齐&#xff0c;选材做工不同&#xff0c;最终价位自然存在差距&#xff0c;挑选时不能只看表面低价。 &#x1f449; 点击…...

30岁裸辞后,我用两个月拿下AI应用认证,现在OFFER选择困难症犯了

30岁裸辞那天&#xff0c;我最怕的不是没收入&#xff0c;而是突然发现&#xff1a;过去积累的经验&#xff0c;正在被AI重新定价。以前会写方案、做表格、跟项目&#xff0c;算是职场硬通货&#xff1b;到了2026年&#xff0c;招聘JD里开始频繁出现AI工具应用、智能工作流、Pr…...

亚马逊卖家公开信息数据提取:反爬攻防战与 Python 批量采集实战

摘要&#xff1a; 批量获取亚马逊&#xff08;Amazon&#xff09;第三方卖家的商业名称、信用代码和注册地址等信息&#xff0c;对于跨境 B2B 拓客和供应链分析具有重要意义。然而&#xff0c;亚马逊的 Cloudflare 盾和 Robot 验证码构成了极高的反爬门槛。本文将深度解析亚马逊…...

环境光遮蔽(Ambient Occlusion):揭秘那个让虚拟世界“有重量感“的阴影魔法

一、一个让我"开窍"的老木匠故事 我有个朋友是传统家具的修复师&#xff0c;他给我讲过一个让我至今难忘的故事。他说他刚入行时跟着一位 70 多岁的老木匠师父学习——师父让他做的第一件事不是雕花、不是榫卯——而是"看阴影"——这个看似奇怪的训练改变了…...

告别硬编码!在UE5.1里用蓝图动态配置MySQL连接参数(控件蓝图实战)

动态配置MySQL连接&#xff1a;UE5.1控件蓝图的工程化实践在游戏开发中&#xff0c;数据库连接往往是项目架构中不可或缺的一环。传统硬编码方式虽然简单直接&#xff0c;却带来了维护困难、安全性差、灵活性低等一系列问题。本文将深入探讨如何在UE5.1中构建一个完全动态化的M…...

php有什么版本,php语言有几个版本

php有什么版本,php语言有几个版本PHP的大版本主要分四支&#xff1a;PHP4/PHP5/PHP6/PHP7 其中&#xff0c;PHP4由于太古老、对OO支持不力已基本被淘汰&#xff0c;请无视PHP4。 PHP6由于基本没有生产线上的应用&#xff0c;还基本只是一款概念产品&#xff0c;很多功能已在PHP…...

告别杂乱!用FileMenu Tools 8.4.2一键清理Windows 11右键菜单(附隐藏技巧)

Windows 11右键菜单精简指南&#xff1a;用FileMenu Tools打造高效工作流每次在文件上点击右键时&#xff0c;那个缓慢弹出的冗长菜单是否让你感到烦躁&#xff1f;随着安装的软件越来越多&#xff0c;Windows的右键菜单往往会变得臃肿不堪&#xff0c;严重影响工作效率。今天&…...

Style-Bert-VITS2未来发展方向:从语音克隆到实时语音转换的技术演进路线

Style-Bert-VITS2未来发展方向&#xff1a;从语音克隆到实时语音转换的技术演进路线 【免费下载链接】Style-Bert-VITS2 Style-Bert-VITS2: Bert-VITS2 with more controllable voice styles. 项目地址: https://gitcode.com/gh_mirrors/st/Style-Bert-VITS2 Style-Bert…...

Nacos CVE-2021-29441漏洞深度解析:User-Agent绕过与鉴权失效

1. 这个漏洞不是“改个Header就能登录”&#xff0c;而是Nacos鉴权体系的一道裂缝CVE-2021-29441这个编号在Nacos社区里曾被轻描淡写地归为“低危”&#xff0c;直到我接手一个金融客户线上告警——他们的Nacos集群在凌晨三点被批量创建了37个高权限用户&#xff0c;所有操作日…...

基于晶体管逻辑的水箱自动控制器设计与实现

1. 项目概述&#xff1a;一个基于晶体管逻辑的自动水箱/湿度灌溉控制器 如果你也像我一样&#xff0c;曾经为家里的花园、阳台植物或者农村老家的储水塔手动开关水泵而烦恼&#xff0c;那么这个项目就是为你准备的。我设计并制作了一个完全自动化的水箱水位控制器&#xff0c;它…...