新聞中心
[[423684]]
一、前言
單獨(dú)的使用typescript 并不會導(dǎo)致學(xué)習(xí)成本很高,但是絕大部分前端開發(fā)者的項(xiàng)目都是依賴于框架的

10年積累的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有景泰免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
例如和vue、react 這些框架結(jié)合使用的時(shí)候,會有一定的門檻
使用 TypeScript 編寫 react 代碼,除了需要 typescript 這個(gè)庫之外,還需要安裝@types/react、@types/react-dom
- npm i @types/react -s
- npm i @types/react-dom -s
至于上述使用@types的庫的原因在于,目前非常多的javascript庫并沒有提供自己關(guān)于 TypeScript 的聲明文件
所以,ts并不知道這些庫的類型以及對應(yīng)導(dǎo)出的內(nèi)容,這里@types實(shí)際就是社區(qū)中的DefinitelyTyped庫,定義了目前市面上絕大多數(shù)的JavaScript庫的聲明
所以下載相關(guān)的javascript對應(yīng)的@types聲明時(shí),就能夠使用使用該庫對應(yīng)的類型定義
二、使用方式
在編寫react項(xiàng)目的時(shí)候,最常見的使用的組件就是:
- 無狀態(tài)組件
- 有狀態(tài)組件
- 受控組件
無狀態(tài)組件
主要作用是用于展示UI,如果使用js聲明,則如下所示:
- import * as React from 'react'
- export const Logo = props => {
- const { logo, className, alt } = props
- return (
- )
- }
但這時(shí)候ts會出現(xiàn)報(bào)錯(cuò)提示,原因在于沒有定義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 (
- )
- }
但是我們都知道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
= props => { - const { logo, className, alt } = props
- return (
- )
- }
- React.FC顯式地定義了返回類型,其他方式是隱式推導(dǎo)的
- React.FC對靜態(tài)屬性:displayName、propTypes、defaultProps提供了類型檢查和自動補(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
{ - public state = {
- count: 1,
- }
- public render () {
- return (
Hello world- )
- }
- }
上述通過泛型對props、state進(jìn)行類型定義,然后在使用的時(shí)候就可以在編譯器中獲取更好的智能提示
關(guān)于Component泛型類的定義,可以參考下 React 的類型定義文件 node_modules/@types/react/index.d.ts,如下所示:
- class Component
{
- readonly props: Readonly<{ children?: ReactNode }> & Readonly
;
- state: Readonly
;
從上述可以看到,state屬性也定義了可讀類型,目的是為了防止直接調(diào)用this.state更新狀態(tài)
受控組件
受控組件的特性在于元素的內(nèi)容通過組件的狀態(tài)state進(jìn)行控制
由于組件內(nèi)部的事件是合成事件,不等同于原生事件,
例如一個(gè)input組件修改內(nèi)部的狀態(tài),常見的定義的時(shí)候如下所示:
- private updateValue(e: React.ChangeEvent
) { - this.setState({ itemText: e.target.value })
- }
常用Event 事件對象類型:
- ClipboardEvent 剪貼板事件對象
- DragEvent 拖拽事件對象
- ChangeEvent Change 事件對象
- KeyboardEvent 鍵盤事件對象
- MouseEvent 鼠標(biāo)事件對象
- TouchEvent 觸摸事件對象
- WheelEvent 滾輪事件對象
- AnimationEvent 動畫事件對象
- TransitionEvent 過渡事件對象
- T接收一個(gè)DOM 元素類型
三、總結(jié)
上述只是簡單的在react項(xiàng)目使用typescript,但在編寫react項(xiàng)目的時(shí)候,還存在hooks、默認(rèn)參數(shù)、以及store等等......
typescript在框架中使用的學(xué)習(xí)成本相對會更高,需要不斷編寫才能熟練
標(biāo)題名稱:面試官:說說如何在React項(xiàng)目中應(yīng)用TypeScript
瀏覽地址:http://fisionsoft.com.cn/article/coghdjj.html


咨詢
建站咨詢
