一、前言

单独的使用typescript 并不会导致学习成本很高,但是绝大部分前端开发者的项目都是依赖于框架的

例如和vuereact 这些框架结合使用的时候,会有一定的门槛

使用 TypeScript 编写 react 代码,除了需要 typescript 这个库之外,还需要安装@types/react@types/react-dom

  1. npm i @types/react -s

    npm i @types/react-dom -s

至于上述使用@types的库的原因在于,目前非常多的javascript库并没有提供自己关于 TypeScript 的声明文件

所以,ts并不知道这些库的类型以及对应导出的内容,这里@types实际就是社区中的DefinitelyTyped库,定义了目前市面上绝大多数的JavaScript库的声明

所以下载相关的javascript对应的@types声明时,就能够使用使用该库对应的类型定义

二、使用方式

在编写react项目的时候,最常见的使用的组件就是:

  • 无状态组件
  • 有状态组件
  • 受控组件

无状态组件

主要作用是用于展示UI,如果使用js声明,则如下所示:

  1. import * as React from 'react'

    export const Logo = props => {
        const { logo, className, alt } = props

        return (
            <img src={logo} className={className} alt={alt} />
        )
    }

但这时候ts会出现报错提示,原因在于没有定义porps类型,这时候就可以使用interface接口去定义porps即可,如下:

  1. import * as React from 'react'

    interface IProps {
        logo?: string
        className?: string
        alt?: string
    }

    export const Logo = (props: IProps) => {
        const { logo, className, alt } = props

        return (
            <img src={logo} className={className} alt={alt} />
        )
    }

但是我们都知道props里面存在children属性,我们不可能每个porps接口里面定义多一个children,如下:

  1. interface IProps {
        logo?: string
        className?: string
        alt?: string
        children?: ReactNode
    }

更加规范的写法是使用React里面定义好的FC属性,里面已经定义好children类型,如下:

  1. export const Logo: React.FC<IProps> = props => {
        const { logo, className, alt } = props

        return (
            <img src={logo} className={className} alt={alt} />
        )
    }

  • React.FC显式地定义了返回类型,其他方式是隐式推导的

  • React.FC对静态属性:displayName、propTypes、defaultProps提供了类型检查和自动补全

  • React.FC为children提供了隐式的类型(ReactElement | null)

有状态组件

可以是一个类组件且存在propsstate属性

如果使用typescript声明则如下所示:


  1. import * as React from 'react'

    interface IProps {
      color: string,
      size?: string,
    }
    interface IState {
      count: number,
    }
    class App extends React.Component<IProps, IState> {
      public state = {
        count: 1,
      }
      public render () {
        return (
          <div>Hello world</div>
        )
      }
    }

上述通过泛型对propsstate进行类型定义,然后在使用的时候就可以在编译器中获取更好的智能提示

关于Component泛型类的定义,可以参考下 React 的类型定义文件 node_modules/@types/react/index.d.ts,如下所示:

  1. class Component<P, S> {

        readonly props: Readonly<{ children?: ReactNode }> & Readonly<P>;

        state: Readonly<S>;

    }

从上述可以看到,state属性也定义了可读类型,目的是为了防止直接调用this.state更新状态

受控组件

受控组件的特性在于元素的内容通过组件的状态state进行控制

由于组件内部的事件是合成事件,不等同于原生事件,

例如一个input组件修改内部的状态,常见的定义的时候如下所示:

  1. private updateValue(e: React.ChangeEvent<HTMLInputElement>) {
        this.setState({ itemText: e.target.value })
    }

常用Event 事件对象类型:

  • ClipboardEvent<T = Element> 剪贴板事件对象
  • DragEvent<T = Element> 拖拽事件对象
  • ChangeEvent<T = Element>  Change 事件对象
  • KeyboardEvent<T = Element> 键盘事件对象
  • MouseEvent<T = Element> 鼠标事件对象
  • TouchEvent<T = Element>  触摸事件对象
  • WheelEvent<T = Element> 滚轮事件对象
  • AnimationEvent<T = Element> 动画事件对象
  • TransitionEvent<T = Element> 过渡事件对象

T接收一个DOM 元素类型

三、总结

上述只是简单的在react项目使用typescript,但在编写react项目的时候,还存在hooks、默认参数、以及store等等......

typescript在框架中使用的学习成本相对会更高,需要不断编写才能熟练

React项目中应用TypeScript的更多相关文章

  1. 深入浅出TypeScript(5)- 在React项目中使用TypeScript

    前言 在第二小节中,我们讨论了利用TypeScript创建Web项目的实现,在本下节,我们讨论一下如何结合React创建一个具备TypeScript类型的应用项目. 准备 Webpack配置在第二小节 ...

  2. Vue项目中应用TypeScript

    一.前言 与如何在React项目中应用TypeScript类似 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, 其是基于vue-class-c ...

  3. React项目中使用Mobx状态管理(二)

    并上一节使用的是普通的数据状态管理,不过官方推荐使用装饰器模式,而在默认的react项目中是不支持装饰器的,需要手动启用. 官方参考 一.添加配置 官方提供了四种方法, 方法一.使用TypeScrip ...

  4. 基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中。

    react-amap 这是一个基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中. 文档实例预览: Github Web | Gitee Web 特性 ️ 自动加载高德地 ...

  5. 了解CSS in JS(JSS)以及在React项目中配置并使用JSS

    目录 认识JSS 什么是JSS JSS 的常见实现 JSS 的好处与坏处 好处 坏处 使用模块化CSS实现JSS 安装插件 在React项目中的tsconfig.json中添加配置 vscode项目中 ...

  6. 如何在非 React 项目中使用 Redux

    本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...

  7. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

  8. react项目中实现元素的拖动和缩放实例

    在react项目中实现此功能可借助 react-rnd 库,文档地址:https://github.com/bokuweb/react-rnd#Screenshot .下面是实例运用: import ...

  9. React项目中实现右键自定义菜单

    最近在react项目中需要实现一个,右键自定义菜单功能.找了找发现纯react项目里没有什么工具可以实现这样的功能,所以在网上搜了搜相关资料.下面我会附上完整的组件代码. (注:以下代码非本人原创,具 ...

随机推荐

  1. JIPB | 两篇连发:华中农大黄俊斌团队报道二羟基异丁酰化调控稻曲病菌致病新机制

    水稻是我国重要的粮食作物,稻曲病是水稻三大病害之一,不仅造成稻米产量损失,更重要的是稻曲球中的稻曲菌素的毒性和致畸作用,给人畜健康带来严重威胁.病原菌对植物的侵袭是由病原菌的毒力和植物免疫系统相互作用 ...

  2. Unity 不规则按钮实现

    1.先重写Image类,实现对Image图形范围的重写: 2.对不规则按钮添加Polygon Collider2D组件,调整大小圈中要点击的范围: 3.将重写的Image类添加到不规则按钮上时,需要移 ...

  3. [TensorFlow2.0]-Fashion-MNIST本地数据集及fit_generator()的使用

    本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...

  4. springboot打包问题

    pom.xml <build> <plugins> <plugin> <groupId>org.springframework.boot</gro ...

  5. Git-04-本地仓库撤销修改

    编辑修改了文件,但是还没有git add之前 直接用 git checkout -- filename 这个命令就可以了 已经 git add 了,但是没有 git commit 之前 1 模拟git ...

  6. Xilinx约束学习笔记(二)—— 定义时钟

    2. 定义时钟 2.1 关于时钟 为了获得最佳精度路径覆盖信息,必须正确定义时钟. 时钟要定义在时钟树的根 pin 或 port 上,称为 source point. 时钟的边缘应该由周期和波形进行组 ...

  7. 题解 graph

    传送门 一道做了巨久,不过确实很好的题 发现不定边权极难处理,所以就不会 感觉和这题有点像,但还是不会 但发现题面里有个地方很套路 要求有哪些点/边最终可以满足最短/最小,比如这样或这样的题,考虑凸包 ...

  8. HttpURLConnection 中Cookie 使用

    方式一: 如果想通过 HttpURLConnection 访问网站,网站返回cookie信息,下次再通过HttpURLConnection访问时,把网站返回 cookie信息再返回给该网站.可以使用下 ...

  9. SpringCloud分布式配置中心Config

    统一管理所有配置. 1.微服务下的分布式配置中心 简介:讲解什么是配置中心及使用前后的好处 什么是配置中心: 一句话:统一管理配置, 快速切换各个环境的配置 相关产品: 百度的disconf 地址:h ...

  10. spring初始化源码浅析之关键类和扩展接口

    目录 1.关键接口和类 1.1.关键类之 DefaultListableBeanFactory 1.2.关键类之XmlBeanDefinitionReader 1.3.关键类之ClassPathXml ...