React--》如何在React中创建TypeScript项目并使用?

news2024/11/28 2:29:12

目录

React中创建TS项目

TS目录结构

React函数组件类型

React类组件类型


        如果你已经掌握了TS中基础类型、高级类型的使用,还想在前端项目中更深一层的使用TS,还需要掌握React、Vue、Angular等框架和框架提供的API,懂得如何在框架中使用TS,今天讲解如何在React项目中使用TS。如果想学习TS相关知识,推荐看一下我之前的专栏对TypeScript的相关讲解:TypeScript专栏 。

React中创建TS项目

如果不了解React脚手架搭建可以看下我之前的文章:超详细教程——React脚手架的搭建与使用

React的脚手架create-react-app(简称:CPA)默认支持TypeScript。React中创建TS的命令如下:

npx create-react-app 项目名称 --template typescript

出现如下表明React脚手架创建TS项目成功!

将创建项目的文件夹拖到编辑器上新建终端运行npm start命令即可运行项目:

上面这种是新建的使用TS的React项目,那么如何在已有的项目中使用TS呢?要知道普通的项目都是以JS项目创建的,看看官方文档怎么给出解决办法 :Adding TypeScript 。

# npm安装
npm install --save typescript @types/node @types/react @types/react-dom @types/jest
# yarn安装
yarn add typescript @types/node @types/react @types/react-dom @types/jest

总结

我们之前在不使用TS时,会使用prop-types库,为React组件提供类型检查,而在使用TS后,其提供的组件类型校验代替了PropTypes,所以说不管是React还是Vue,只要是支持TS的库,都提供了很多类型来满足该库对类型的需求。

推荐一个网站:React+TS备忘单 ,里面详细介绍了很多React+TS的技巧。

TS目录结构

相对于非TS项目,目录结构主要发生以下的变化。

1)项目根目录中增加了tsconfig.json配置文件指定TS的编译选项(例如:编译时是否移除注释)。

tsconfig.json文件中其配置文件选项的具体功能如下:

{
  // 编译选项
  "compilerOptions": {
    // 生成代码的语言版本
    "target": "es5",
    // 指定要包含在编译中的 library
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    // 允许 ts 编译器编译的 js 文件
    "allowJs": true,
    // 跳过声明文件的类型检查
    "skipLibCheck": true,
    // es模块互操作,屏蔽 esModule 和 CommonJS 之间的差异
    "esModuleInterop": true,
    // 允许通过 import x from 'y' 即使模块没有显式指定 default 导出
    "allowSyntheticDefaultImports": true,
    // 开启严格模式
    "strict": true,
    // 对文件名称强制区分大小写
    "forceConsistentCasingInFileNames": true,
    // 为 switch 语句启用错误报告
    "noFallthroughCasesInSwitch": true,
    // 生成代码的模块化标准
    "module": "esnext",
    // 模块解析查找的策略
    "moduleResolution": "node",
    // 允许导入扩展名为 .json 的模块
    "resolveJsonModule": true,
    // 是否将没有 import/export 的文件视为旧 (全局而非模块化) 的脚本文件
    "isolatedModules": true,
    // 编译时不生成任何文件(只进行类型检查)
    "noEmit": true,
    // 指定将 JSX 编译成什么形式
    "jsx": "react-jsx"
  },
  // 指定允许 ts 处理的目录
  "include": [
    "src"
  ]
}

注意:TS的配置项非常多(100+),以CPA项目中的为例,如上面的配置文件,如果想使用其它的配置,查阅 官方文档 即可。

1)tsconfig.json文件所在目录为项目根目录(与package.json同级)

2)tsconfig.json可以自动生成,无需执行 tsc --init 命令进行生成

2)React组件的文件扩展名变为:*.tsx

3)src目录中增加了react-app-env.d.ts:React项目默认的类型声明文件

react-scripts的类型声明文件包含了两部分类型:

1)react、react-dom、node的类型

2)图片、样式等模块的类型,以允许在代码中导入图片、SVG等文件。

TS会自动加载该.d.ts文件以提供类型声明(通过修改tsconfig.json中的include配置来验证)。

接下来的讲解会以React17为主,所以创建的TS项目要对react和react-dom进行降级,不清楚的可以看一下我上文提到的创建React脚手架的教程。

React函数组件类型

React是组件化开发模式,React开发主要任务就是写组件,常用的函数组件包括以下几点:

组件的类型和属性(props)

import  { FC } from 'react'
import ReactDOM from 'react-dom'

type Props = {name:string; age?:number}

// 完全按照函数在TS中的写法
// const Hello: FC<Props> = ({name,age})=>{
//   return <div>
//     你好,我叫: {name}, 我今年{age}岁了
//   </div>;
// }

// FC是一个函数式组件,是在TypeScript使用一个泛型,FC就是FunctionComponent的缩写
const Hello: FC<Props> = ({name,age})=>{
  return <div>
    你好,我叫: {name}, 我今年{age}岁了
  </div>;
}

const App =()=>{
  return <div>
    <Hello name='张三' age={18} />
  </div>
}
 
ReactDOM.render(<App />,document.getElementById('root'))

组件属性的默认值(defaultProps)

import  { FC } from 'react'
import ReactDOM from 'react-dom'
type Props = {name:string; age?:number}
const Hello: FC<Props> = ({name,age})=>{
  return <div>
    你好,我叫: {name}, 我今年{age}岁了
  </div>;
}
// 给可选属性age添加默认值
Hello.defaultProps = {
  age:18
}
const App =()=>{
  return <div>
    <Hello name='张三' />
  </div>
}
ReactDOM.render(<App />,document.getElementById('root'))

事件绑定和事件对象

import React from 'react';
import ReactDOM from 'react-dom'

// 当然也可以完全简化采用函数在TS中的写法
const Hello = ()=>{
  // 点击事件
  const onClick = (e: React.MouseEvent<HTMLButtonElement>)=>{
    console.log('打印当前元素',e.currentTarget);
  }
  // 监听事件
  const onChange = (e: React.ChangeEvent<HTMLInputElement>)=>{
    console.log(e.target.value)
  }
  return <div>
    <button onClick={onClick}>点我触发事件</button>
    <input type="text" onChange={onChange} />
  </div>;
}
const App =()=>{
  return <div>
    <Hello />
  </div>
}
ReactDOM.render(<App />,document.getElementById('root'))

在JSX中写事件处理程序(e=>{}),然后把鼠标放到e上,利用TS的类型推论来查看事件对象类型。

React类组件类型

class组件的常用类型,主要包括以下内容:

组件类型

type State = {count:number}
type Props = {message?:string}

class C1 extends React.Component {} // 无props、state
class C2 extends React.Component<Props> {} // 有props,无state
class C3 extends React.Component<{},State> {} // 无props,有state
class C4 extends React.Component<Props,State> {} // 有props、state

组件属性

import React from 'react';
import ReactDOM from 'react-dom'

type Props  = {name:string;age?:number}
class Hello extends React.Component<Props> {
  // 提供属性的默认值
  static defaultProps: Partial<Props> = {
    age: 20
  }
  render(): React.ReactNode {
    const {name,age} = this.props
    return (
      <div>
        你好,我叫:{name},今年{age}岁了
      </div>
    )
  }
}

const App =()=>{
  const person = {name:'张三'}
  return <div>
    <Hello {...person} />
  </div>
}
ReactDOM.render(<App />,document.getElementById('root'))

组件状态和事件

import React from 'react';
import ReactDOM from 'react-dom'

type State = {count:number}
class Count extends React.Component<{},State> {
  // 定义状态
  state: State = {
    count:0
  }
  addCount = ()=>{
    this.setState({
      count:this.state.count + 1
    })
  }
  render(): React.ReactNode {
    return (
      <div>
        计数器:{this.state.count}
        <br />
        <button onClick={this.addCount}>+1</button>
      </div>
    )
  }
}
const App =()=>{
  return <div>
    <Count />
  </div>
}
ReactDOM.render(<App />,document.getElementById('root'))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ROS】—— 机器人导航(仿真)—导航实现(十八)[重要][重要][重要]

文章目录前言准备条件1. 导航实现01_SLAM建图1.1 gmapping简介1.2 gmapping节点说明1.3 gmapping使用1.3.1 编写gmapping节点相关launch文件1.3.2 执行2. 导航实现02_地图服务2.1 map_server简介2.2 map_server使用之地图保存节点(map_saver)2.2.1 map_saver节点说明2.2.2 地图…

你是真的“C”——函数递归详解汉诺塔+青蛙跳台阶

函数递归详解汉诺塔青蛙跳台阶问题&#x1f60e;前言&#x1f64c;函数递归之汉诺塔详解分析&#x1f64c;汉诺塔问题的简介&#x1f60a;汉诺塔的移动图解&#x1f60a;汉诺塔具体的移动过程展示&#x1f60a;汉诺塔的难处所在&#xff1a;&#x1f60a;函数递归之青蛙跳台阶详…

从头安装gdal库(Linux环境下的Python版)

目录前言GDAL安装SWIG安装proj 安装sqlite安装pkg-config 安装其他报错No package libtiff-4 foundPackage liblzma, required by libtiff-4, not foundPackage libjpeg, required by libtiff-4, not foundPackage zlib, required by libtiff-4, not foundchecking for curl-co…

Windows下IIS部署网站流程

IIS Internet information service 是一个web服务器 1. IIS用于windows系统 2.apache用于Linux系统&#xff0c;JAVA的web服务器 3.Nginx用于Linux&#xff0c;负责负载均衡&#xff0c;反向代理 安装完IIS之后&#xff0c;去更改DNS的指向。 DNS指向&#xff1a;IP 和 域名 的…

Dopamine-PEG-N3,多巴胺聚乙二醇叠氮 科研试剂用于点击化学

中文&#xff1a;多巴胺-聚乙二醇-叠氮 英文&#xff1a;Dopamine-PEG-N3&#xff0c;DOPA-PEG-azide 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治 外观: 固体或粘性液体&#xff0c;取决于分子量 …

3D游戏引擎系统源码C++本科毕业设计,C++ 3D引擎源码,渲染系统使用的OpenGL 及 OpenGL ES

Effective 3D Engine 渲染系统使用的OpenGL 及 OpenGL ES&#xff0c;Windows上OpenGL ES使用AMD的ES模拟器。 环境部署 完整代码下载地址&#xff1a;3D游戏引擎系统源码C本科毕业设计 Win32环境配置 编辑器 将proj_win32/RenderSystem/gles_renderSystem/GLES/dll 中的d…

【web】微信小程序笔记小结(模板与配置)

来源&#xff1a;黑马程序员前端微信小程序开发教程 目录 I. WXML 模板语法 ① 数据绑定 ※※ 基本原则 ※※ 在 data 中定义数据 ※※ 在 WXML 中使用数据 ※※※※ Mustache 语法的格式 ※※※※ Mustache 主要应用场景 1&#xff09;动态绑定内容 2&#xff09;动…

测试篇(二): 如何合理的创建bug、bug的级别、bug的生命周期、跟开发产生争执怎么办

目录一、如何合理的创建bug二、bug的等级三、bug的生命周期四、和开发产生争执怎么办一、如何合理的创建bug 创建Bug的目的就是为了能够让其他人可以尝试复现 一个合格的bug应该包含以下一个要素&#xff1a; 发现问题的版本 例如Web程序对应的浏览器版本&#xff0c;或某个应…

AutoLISP 演练(一)

一、输入左下角点、矩形宽、矩形高后&#xff0c;自动的将图形依所给的条件画出二、变量约定本程序所需的AutoLisp功能函数&#xff08;setq 变量名 变量值&#xff09; ⬅ 设定变量值&#xff08;getpoint [基点] [提示]&#xff09; ⬅ 请求参考基点输入一个点坐标(getreal […

PyTorch中contiguous、view、Sequential、permute函数的用法

在pytorch中&#xff0c;tensor的实际数据以一维数组&#xff08;storage&#xff09;的形式存储于某个连续的内存中&#xff0c;以“行优先”进行存储。 1. tensor的连续性 tensor连续&#xff08;contiguous&#xff09;是指tensor的storage元素排列顺序与其按行优先时的元素…

【前端】列表页点进某个详情页,详情页可按顺序跳转到上一条/下一条的实现思路(2种)

需求概述 列表页展示列表&#xff0c;点击某个列表可以跳转到对应的详情页&#xff0c;点击上一页下一页可以按列表顺序跳转到对应详情页。比如点击列表2进入到详情2&#xff0c;我点上一页可以跳转到详情1&#xff0c;点击下一页可以跳转到详情3。难点&#xff1a;详情页如何…

Http客户端 Feign 的使用 (黑马springcloud笔记)

Feign基本使用 目录Feign基本使用一、Feign代替RestTemplate二、自定义配置三、Feign使用优化1. 底层优化2. 日志优化四、最佳实践方式一&#xff1a;继承方式二&#xff1a;抽取一、Feign代替RestTemplate 步骤&#xff1a; 引入依赖 <dependency><groupId>org.s…

UITableView内输入框(UITextView)换行

业务描述&#xff1a; UITableView内存在一个Cell&#xff0c;该Cell内有一输入框可以输入文字&#xff0c;超出输入框宽度则换行展示&#xff0c;即该Cell高度要增加 如图&#xff1a; 解决方法&#xff1a; 思路&#xff1a; 1:取到最大输入框宽度 2:计算当前文字宽度与最…

QT自定义控件工程结构框架

目录前言一、cutewidgets是什么&#xff1f;二、工程结构三、框架的工程配置1 cutewidgets.pro2 cutewidgets.pri2.1 cutewidgetsconfig.pri2.2 cutewidgetsfunctions.pri2.3 cutewidgetsbuild.pri四、源码1 src1.1 src.pro1.2 cutewidgets_global.h1.3 testedit1.4 扩展2 exam…

互联网中断检测技术窥览与讨论

前言&#xff1a; 如其他人造系统一样&#xff0c;互联网的运行也会出现异常甚至中断。仅在2022年就发生了多起影响重大的互联网中断事件&#xff1a;1月15日汤加火山喷发三个小时后&#xff0c;全国断网&#xff0c;和外界的所有电话与网络联系都无法接通&#xff1b;3月28日…

系统分析师案例必备知识点汇总---2023系列文章二

需求获取 1、需求获取的技术&#xff1a; 用户访谈 优点&#xff1a;具有良好的灵活性&#xff0c;有较宽广的应用范围。 缺点是&#xff1a;用户忙&#xff0c;信息量大&#xff0c;记录困难&#xff0c;需要沟通技巧。 问卷调查 优点&#xff1a;短时间内收集数据。 缺点…

Python aiohttp 库是否值得学?那必须要掌握呀

aiohttp 是一个基于 asyncio 的异步 HTTP 客户端/服务器库。它提供了一组用于编写高性能异步网络应用程序的工具&#xff0c;包括基于协程的客户端和服务器。 库的安装使用 pip install aiohttp Python aiohttp 库通过 aiohttp 搭建服务器aiohttp 路由aiohttp 中间件aiohttp 发…

【机器学习之模型融合】Blending混合法

前言 Stacking堆叠法基础知识&#xff1a;http://t.csdn.cn/dzAna 1、Blending的基本思想与流程&#x1f47f; Blending融合是在Stacking融合的基础上改进过后的算法。在之前的课程中我们提到&#xff0c;堆叠法stacking在level 1上使用算法&#xff0c;这可以令融合本身向着损…

好家伙,这几个隐藏功能,太香了

很多小伙伴可能被小畅的问题搞糊涂了&#xff0c;因为很多人只会在电脑上堆砌各种小应用&#xff0c;而忽略了Windows原有的实用功能。 而我们也千万不要小看这些功能&#xff0c;它们说不定能在关键时刻助你一臂之力&#xff0c;帮到你不少忙呢&#xff01; 那么今天小畅就为大…

MobaXterm连接出现 Network error: Connection timed out 问题解决

MobaXterm连接出现 Network error: Connection timed out&#xff1a; 接前文&#xff1a;CentOS安装, 点此查看文章&#xff0c;安装之后的SSH连接&#xff1a; 解决思路如下&#xff1a; 1、检查虚拟机端是否安装ssh 一般情况是可以自动安装的&#xff0c;直接在终端输入s…