React項(xiàng)目中應(yīng)用TypeScript的實(shí)現(xiàn)
一、前言
單獨(dú)的使用typescript 并不會(huì)導(dǎo)致學(xué)習(xí)成本很高,但是絕大部分前端開發(fā)者的項(xiàng)目都是依賴于框架的
例如和vue、react 這些框架結(jié)合使用的時(shí)候,會(huì)有一定的門檻
使用 TypeScript 編寫 react 代碼,除了需要 typescript 這個(gè)庫(kù)之外,還需要安裝@types/react、@types/react-dom
npm i @types/react -s npm i @types/react-dom -s
至于上述使用@types的庫(kù)的原因在于,目前非常多的javascript庫(kù)并沒(méi)有提供自己關(guān)于 TypeScript 的聲明文件
所以,ts并不知道這些庫(kù)的類型以及對(duì)應(yīng)導(dǎo)出的內(nèi)容,這里@types實(shí)際就是社區(qū)中的DefinitelyTyped庫(kù),定義了目前市面上絕大多數(shù)的JavaScript庫(kù)的聲明
所以下載相關(guān)的javascript對(duì)應(yīng)的@types聲明時(shí),就能夠使用使用該庫(kù)對(duì)應(yīng)的類型定義
二、使用方式
在編寫react項(xiàng)目的時(shí)候,最常見的使用的組件就是:
- 無(wú)狀態(tài)組件
- 有狀態(tài)組件
- 受控組件
無(wú)狀態(tài)組件
主要作用是用于展示UI,如果使用js聲明,則如下所示:
import * as React from 'react' export const Logo = props => { const { logo, className, alt } = props return ( <img src={logo} className={className} alt={alt} /> ) }
但這時(shí)候ts會(huì)出現(xiàn)報(bào)錯(cuò)提示,原因在于沒(méi)有定義porps類型,這時(shí)候就可以使用interface接口去定義porps即可,如下:
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屬性,我們不可能每個(gè)porps接口里面定義多一個(gè)children,如下:
interface IProps { logo?: string className?: string alt?: string children?: ReactNode }
更加規(guī)范的寫法是使用React里面定義好的FC屬性,里面已經(jīng)定義好children類型,如下:
export const Logo: React.FC<IProps> = props => { const { logo, className, alt } = props return ( <img src={logo} className={className} alt={alt} /> ) }
- React.FC顯式地定義了返回類型,其他方式是隱式推導(dǎo)的
- React.FC對(duì)靜態(tài)屬性:displayName、propTypes、defaultProps提供了類型檢查和自動(dòng)補(bǔ)全
- React.FC為children提供了隱式的類型(ReactElement | null)
有狀態(tài)組件
可以是一個(gè)類組件且存在props和state屬性
如果使用typescript聲明則如下所示:
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> ) } }
上述通過(guò)泛型對(duì)props、state進(jìn)行類型定義,然后在使用的時(shí)候就可以在編譯器中獲取更好的智能提示
關(guān)于Component泛型類的定義,可以參考下 React 的類型定義文件 node_modules/@types/react/index.d.ts,如下所示:
class Component<P, S> { readonly props: Readonly<{ children?: ReactNode }> & Readonly<P>; state: Readonly<S>; }
從上述可以看到,state屬性也定義了可讀類型,目的是為了防止直接調(diào)用this.state更新狀態(tài)
受控組件
受控組件的特性在于元素的內(nèi)容通過(guò)組件的狀態(tài)state進(jìn)行控制
由于組件內(nèi)部的事件是合成事件,不等同于原生事件,
例如一個(gè)input組件修改內(nèi)部的狀態(tài),常見的定義的時(shí)候如下所示:
private updateValue(e: React.ChangeEvent<HTMLInputElement>) { this.setState({ itemText: e.target.value }) }
常用Event 事件對(duì)象類型:
- ClipboardEvent<T = Element> 剪貼板事件對(duì)象
- DragEvent<T = Element> 拖拽事件對(duì)象
- ChangeEvent<T = Element> Change 事件對(duì)象
- KeyboardEvent<T = Element> 鍵盤事件對(duì)象
- MouseEvent<T = Element> 鼠標(biāo)事件對(duì)象
- TouchEvent<T = Element> 觸摸事件對(duì)象
- WheelEvent<T = Element> 滾輪事件對(duì)象
- AnimationEvent<T = Element> 動(dòng)畫事件對(duì)象
- TransitionEvent<T = Element> 過(guò)渡事件對(duì)象
T接收一個(gè)DOM 元素類型
三、總結(jié)
上述只是簡(jiǎn)單的在react項(xiàng)目使用typescript,但在編寫react項(xiàng)目的時(shí)候,還存在hooks、默認(rèn)參數(shù)、以及store等等......
typescript在框架中使用的學(xué)習(xí)成本相對(duì)會(huì)更高,需要不斷編寫才能熟練
到此這篇關(guān)于React項(xiàng)目中應(yīng)用TypeScript的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)React項(xiàng)目應(yīng)用TypeScript 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)析React Native startReactApplication 方法
這篇文章主要介紹了React Native startReactApplication 方法簡(jiǎn)析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09react 下拉框內(nèi)容回顯的實(shí)現(xiàn)思路
這篇文章主要介紹了react 下拉框內(nèi)容回顯,實(shí)現(xiàn)思路是通過(guò)將下拉框選項(xiàng)的value和label一起存儲(chǔ)到state中, 初始化表單數(shù)據(jù)時(shí)將faqType對(duì)應(yīng)的label查找出來(lái)并設(shè)置到Form.Item中,最后修改useEffect,需要的朋友可以參考下2024-05-05淺談React + Webpack 構(gòu)建打包優(yōu)化
本篇文章主要介紹了淺談React + Webpack 構(gòu)建打包優(yōu)化,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01react-router-dom v6版本跳轉(zhuǎn)路徑的實(shí)現(xiàn)方法
這篇文章主要介紹了react-router-dom v6版本跳轉(zhuǎn)路徑的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03React?Refs?的使用forwardRef?源碼示例解析
這篇文章主要為大家介紹了React?之?Refs?的使用和?forwardRef?的源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11