iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >TypeScript在React项目中的使用实践总结
  • 551
分享到

TypeScript在React项目中的使用实践总结

2024-04-02 19:04:59 551人浏览 独家记忆
摘要

序言 本文会侧重于typescript(以下简称TS)在项目中与React的结合使用情况,而非TS的基本概念。关于TS的类型查看可以使用在线TS工具👉TypeScri

序言

本文会侧重于typescript(以下简称TS)在项目中与React的结合使用情况,而非TS的基本概念。关于TS的类型查看可以使用在线TS工具👉TypeScript游乐场

React元素相关

React元素相关的类型主要包括ReactnodeReactElementjsX.Element

  • ReactNode。表示任意类型的React节点,这是个联合类型,包含情况众多;
  • ReactElement/JSX。从使用表现上来看,可以认为这两者是一致的,属于ReactNode的子集,表示“原生的DOM组件”或“自定义组件的执行结果”。

使用示例如下:


const MyComp: React.FC<{ title: string; }> = ({title}) => <h2>{title}</h2>;

// ReactNode
const a: React.ReactNode =
  null ||
  undefined || <div>hello</div> || <MyComp title="world" /> ||
  "abc" ||
  123 ||
  true;

// ReactElement和JSX.Element
const b: React.ReactElement = <div>hello world</div> || <MyComp title="Good" />;

const c: JSX.Element = <MyComp title="good" /> || <div>hello world</div>;

原生DOM相关

原生的 DOM 相关的类型,主要有以下这么几个:ElementhtmlElementHTMLxxxElment

简单来说: Element = HTMLElement + SVGElement

SVGElement一般开发比较少用到,而HTMLElement却非常常见,它的子类型包括HTMLDivElementHTMLInputElementHTMLSpanElement等等。

因此我们可以得知,其关系为:Element > HTMLElement > HTMLxxxElement,原则上是尽量写详细。

React合成事件相关

在 React 中,原生事件被处理成了React 事件,其内部是通过事件委托来优化内存,减少DOM事件绑定的。言归正传,React 事件的通用格式为[xxx]Event,常见的有MouseEventChangeEventTouchEvent,是一个泛型类型,泛型变量为触发该事件的 DOM 元素类型。

示例如下:


// input输入框输入文字
const handleInputChange = (evt: React.ChangeEvent<HTMLInputElement>) => {
  console.log(evt);
};

// button按钮点击
const handleButtonClick = (evt: React.MouseEvent<HTMLButtonElement>) => {
  console.log(evt);
};

// 移动端触摸div
const handleDivTouch = (evt: React.TouchEvent<HTMLDivElement>) => {
  console.log(evt);
};

与hooks的结合

在hooks中,并非全部钩子都与TS有强关联,比如useEffect就不依赖TS做类型定义,我们挑选比较常见的几个和TS强关联的钩子来看看。

useState

如果初始值能说明类型,就不用给 useState 指明泛型变量;


// ❌这样写是不必要的,因为初始值0已经能说明count类型
const [count, setCount] = useState<number>(0);

// ✅这样写好点
const [count, setCount] = useState(0);

如果初始值是 null 或 undefined,那就要通过泛型手动传入你期望的类型,并在访问属性的时候通过可选链来规避语法错误。


interface IUser {
  name: string;
  age: number;
}

const [user, setUser] = React.useState<IUser | null>(null);

console.log(user?.name);

useRef

这个 hook 比较特别,它通常有两种用途:

用来连接 DOM,以获取到 DOM 元素;


// 连接DOM,初始值赋值为null,不能是undefined,如要指明泛型变量需要具体到HTMLxxxElement
// 如果我们确定inputRef.current在调用时一定是有值的,可以使用非空断言,在null后添加!
const inputRef = useRef<HTMLInputElement>(null!);

const handleClick = () => {
  inputRef.current.focus(); // 当然不用非空断言,用inputEl.current?.focus()可选链也是可以的
}

return (
  <input ref={inputRef} />
  <button onClick={handleClick}>点击</button>
)

2.用来存储变量,由于是存储在函数式组件的外部,比起 useState,它不会存在异步更新的问题,也不会存在由capture-value特性引发的过时变量的问题,但是要注意赋值后由于ref引用没变,不会引起重渲染。


// 通过初始值来自动指明泛型变量类型
const sum = useRef(0);

// 通过.current直接赋值
sum.current = 3;
// 不存在异步更新问题
console.log(sum.current); // 3

useSelector

useSelector用于获取store中的状态,其第一个固定参数为函数,函数的入参即为store,而store的类型RootState需要在store中提前定义好,一种常见的定义如下:

在store.ts中:


const store = createStore(rootReducer);

export type RootState = ReturnType<typeof rootReducer>;

使用时:


const { var1, var2 } = useSelector((store: RootState) => store.xxx);

自定义 hook

如果我们需要仿照 useState 的形式,返回一个数组出去,则需要在返回值的末尾使用as const,标记这个返回值是个常量,否则返回的值将被推断成联合类型。


const useInfo = () => {
  const [age, setAge] = useState(0);

  return [age, setAge] as const; // 类型为一个元组,[number, React.Dispatch<React.SetStateAction<number>>]
};

redux相关

对于action的定义,我们可以使用官方暴露的AnyAction,放宽对于action内部键值对的限制,如下:


import { AnyAction } from "redux";

const DEF_STATE = {
  count: 0,
  type: 'integer'
};

// 使用redux的AnyAction放宽限制
function countReducer(state = DEF_STATE, action: AnyAction) {
  switch (action.type) {
    case "INCREASE_COUNT":
      return {
        ...state,
        count: state.count + 1,
      };
    case "DECREASE_COUNT":
      return {
        ...state,
        count: state.count - 1,
      };
    default:
      return state;
  }
}

export default countReducer;

规约

子组件的入参命名为[组件名]Props,如:


// 比如当前组件名为InfoCard
export interface InfoCardProps {
  name: string;
  age: number;
}

interface接口类型以大写开头;

后端接口的出入参书写interface,同时使用利于编辑器提示的jsdoc风格做注释,如:


export interface GetUserInfoReqParams {
    
    name: string;
    
    age: number;
    
    gender: string;
}

其他

键名或键值不确定如何处理?


// 表示键名不确定,键值限制为number类型
export interface NotSureAbouTKEy {
  [key: string]: number;
}

// 当键名键值都不确定时,以下接口对任何对象都是适用的
export interface AllNotSure {
  [key: string]: any;
}

如何在接口中使用泛型变量?

所谓泛型,就是预定义类型。它的目的是:达到类型定义的局部灵活,提高复用性。我们通常会在接口中使用泛型,如:


// 通常,我们会为接口的泛型变量指定一个默认类型
interface IHuman<T = unknown> {
  name: string;
  age: number;
  gender: T;
}

// 其他地方使用时
const youngMan: IHuman<string> = {
    name: 'zhangsan',
    age: 18,
    gender: 'male'
}

到此这篇关于TypeScript在React项目中的使用总结的文章就介绍到这了,更多相关TypeScript在React使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: TypeScript在React项目中的使用实践总结

本文链接: https://www.lsjlt.com/news/124222.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • TypeScript在React项目中的使用实践总结
    序言 本文会侧重于TypeScript(以下简称TS)在项目中与React的结合使用情况,而非TS的基本概念。关于TS的类型查看可以使用在线TS工具👉TypeScri...
    99+
    2022-11-12
  • Vue3结合TypeScript项目开发实践总结
    目录概述1、compositon Api1、ref 和 reactive的区别?2、周期函数3、store使用4、router的使用2、关注点分离3、TypeScript支持概述 ...
    99+
    2022-11-12
  • Vite+React+TypeScript手撸TodoList的项目实践
    目录布局与样式创建工程定义全局数据类型实现步骤源码地址布局与样式 一个TodoList长什么样子相信无需多言: 上样式: src/TodoList.css .td-wrapper ...
    99+
    2022-11-13
  • 在React项目中使用TypeScript详情
    目录项目目录及ts文件划分在项目中使用TypeScript具体实践组件声明React Hooks使用useStateuseRefuseCallbackuseMemouseContex...
    99+
    2022-11-13
  • React项目中应用TypeScript的实现
    目录一、前言 二、使用方式 无状态组件 有状态组件 受控组件 三、总结 一、前言 单独的使用typescript 并不会导致学习成本很高,但是绝大部分前端开发者的项目都是依赖于框架...
    99+
    2022-11-12
  • 那些项目中常见的TypeScript错误总结
    目录引言1.TS24562.TS25543.TS11694.TS23455.TS25896.TS2322总结引言 TypeScript 错误信息由错误码和详细信息组成。例如:TS24...
    99+
    2022-11-13
  • Vue项目中常用的实用技巧总结
    本篇内容主要讲解“Vue项目中常用的实用技巧总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue项目中常用的实用技巧总结”吧!目录前言 使用 $attrs 和 $listeners 进行多层...
    99+
    2023-06-20
  • 项目中使用TypeScript的TodoList实例详解
    目录为什么用todolisttodolist的ts化数据到视图实现handleTodoItemreadonly分类交叉类型新增功能联合类型可选属性数据转视图总结为什么用todolis...
    99+
    2023-01-04
    TypeScript TodoList使用 TypeScript TodoList
  • 如何在Vue3.0 项目中使用TypeScript 和 Vite
    如何在Vue3.0 项目中使用TypeScript 和 Vite?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件...
    99+
    2023-06-06
  • React项目中使用Redux的 react-redux
    目录背景UI 组件容器组件connect()mapStateToProps()mapDispatchToProps()组件实例:计数器背景 在前面文章一文理解Redux及其工作原理中...
    99+
    2022-11-13
  • Element中使用ECharts的项目实践
    目录一、引入ECharts1、直接引入echarts (安装echarts项目依赖)2、全局引入 (我们安装完成之后,可以在main.js中全局引入 echarts)3、我们可以将E...
    99+
    2022-11-13
  • 怎么在React项目中使用Redux
    这篇文章主要介绍“怎么在React项目中使用Redux”,在日常操作中,相信很多人在怎么在React项目中使用Redux问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在R...
    99+
    2022-10-18
  • 如何在React项目中使用AntDesign
    目录0.前言1.AntDesign是什么?2.AntDesign如何使用?3.如何具体使用AntDdesign的组件3-1.如何使用 antd 的Table组件3-2.如何使用 an...
    99+
    2022-11-13
  • React实现类似于Vue中的插槽的项目实践
    目录搭建项目实现方式1实现方式2最终效果展示最近刚开始接触React,感觉React比Vue更灵活一些,但是感觉代码确实维护的时候可读性也没有Vue好(可能是因为我太菜了),Vue中...
    99+
    2022-11-13
  • 在React、Vue项目中如何使用SVG
    这篇文章将为大家详细讲解有关在React、Vue项目中如何使用SVG,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在一些现代的扁平化设计网站,特别是移动端网站,经常会包含...
    99+
    2022-10-19
  • 项目实践:如何结合CSS和JavaScript打造优秀网页的经验总结
    项目实践:如何结合CSS和JavaScript打造优秀网页的经验总结随着互联网的快速发展,网页设计已经成为了各行各业都离不开的一项技能。优秀的网页设计可以给用户留下深刻的印象,提升用户体验,增加用户的黏性和转化率。而要做出优秀的网页设计,除...
    99+
    2023-11-04
    CSS 网页设计 JavaScript
  • Golang函数的使用注意事项和最佳实践总结
    Golang是一门非常流行的编程语言,不仅因为它的效率和性能优秀,还因为它非常容易学习和使用。在Golang中函数是一个非常重要的概念,函数不仅可以帮助我们组织代码,还可以简化代码逻辑。但是,使用函数也需要遵循一定的注意事项和最佳实践,本文...
    99+
    2023-05-16
    最佳实践 Golang函数 使用注意事项
  • 在 React 项目中全量使用 Hooks的方法
    目录前言React HooksuseStateuseReducer基础用法进阶用法useContextuseEffectuseLayoutEffectuseRefuseImperat...
    99+
    2022-11-13
    React使用 Hooks  React 项目使用 Hooks
  • Mock.js在Vue项目中的使用小结
    目录写在前面Mock.js 初体验Mock.js语法规范1.数据模板定义规范2.数据占位符定义规范3.一个实际开发中会用到的案例:生成个人信息Mock.js在Vue中的使用1.定义接...
    99+
    2022-11-13
  • 项目实践:如何运用CSS框架快速开发网页的经验总结
    项目实践:如何运用CSS框架快速开发网页的经验总结引言:在如今互联网飞速发展的时代,网页设计与开发的速度和效率成为了项目成功的关键因素之一。为了更快速地实现网页布局和样式的开发,开发者借助CSS框架成为一种常见的选择。本文将通过项目实践的经...
    99+
    2023-11-02
    网页 快速开发 CSS框架
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作