摘要:首先聲明這篇文章是想說明一下最新版本的的新特性帶來的極大的開發體驗提升而不是如何利用開發應用這個特性就是對的支持在的中有說明具體可以參考這里在版本之前我們在開發應用尤其是在配合一類庫的時候經常用到諸如之類的封裝而這些函數其實都可以用裝飾器的
首先聲明, 這篇文章是想說明一下最新版本的 TypeScript(3.0) 的新特性帶來的極大的 React 開發體驗提升. 而不是如何利用 TypeScript 開發 React 應用.
這個特性就是對defaultProps的支持, 在 TypeScript 的 Wiki 中有說明, 具體可以參考這里: Support for defaultProps in JSX.
在3.0版本之前, 我們在開發 React 應用, 尤其是在配合 redux 一類 HOC 庫的時候, 經常用到諸如 connect(TodoList), withRouter(TodoList) 之類的封裝. 而這些函數其實都可以用裝飾器的方式來調用, 比如:
export interface TodoListProps extends RouteComponentProps<{}> { todos: Todo[]; } @withRouter @connect(mapStateToProps) export class TodoList extends PureComponent{ render() { return null } }
但是在結合 TypeScript 的時候, 這中間有個問題, 就是裝飾器會自動注入一些 props 給組件, 這一部分屬性不需要外部傳入, 因此是可選的, 在strictNullCheck屬性開啟的時候, 就會出現屬性沖突. 因為 TS 給不允許裝飾器修改被裝飾的對象的類型, 因此在 props 定義中為required屬性依然為required.
比如對于上面的例子, 在實例化TodoList這個組件的時候, 必需要傳入所有的TodoListProps所定義的屬性, 否則會有TS2322錯誤.
而在 TS 3.0 中, 可以聲明defaultProps屬性來表明某些屬性對外部組件而言是可選的. 比如:
@withRouter @connect((state) => ({ todos: state.todos }) export class TodoList extends PureComponent{ static defaultProps: TodoListProps render() { return null } }
這里的static defaultProps: TodoListProps表明, 所有的TodoList的 props TodoListProps 對外部組件都是可選的. 這就意味著外部組件可以什么屬性都不用傳也不會有錯誤. 同時內部而言所有的屬性都是NotNullable.
綜上, 通常情況下, 我們的一個組件會有一部分屬性由裝飾器注入, 而另一部分則需要外部實例化時傳入, 因此, 可以將一個組件的 props 接口聲明成兩層結構, 第一層為由裝飾器注入的部分, 第二層則為完整的屬性接口, 然后將defaultProps設置成為第一層接口即可. 比如:
export interface TodoListInnerProps extends RouteComponentProps<{}> { todos: Todo[]; } export interface TodoListProps extends TodoListInnerProps { className?: string; onLoad?(): void; } @withRouter @connect((state) => ({ todos: state.todos }) export class TodoList extends PureComponent{ static defaultProps: TodoListInnerProps render() { return null } }
需要注意的是:
TypeScript 要 3.0.1以上
@types/react 要最新版
withRouter, connect 等函數在 @types中, 簽名有問題, 需要手動修改一下:
import { ComponentClass } from "react" import { connect as nativeConnect, MapDispatchToPropsParam, MapStateToPropsParam } from "react-redux" import { withRouter as nativeWithRouter } from "react-router" export type ComponentDecorator=
>(WrappedComponent: T) => T export const connect: ( mapState: MapStateToPropsParam
, P, S>, mapDispatch?: MapDispatchToPropsParam , P> ) => ComponentDecorator = nativeConnect as any export const withRouter: ComponentDecorator = nativeWithRouter as any
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108302.html
摘要:使用官方的的另外一種版本和一起使用自動配置了一個項目支持。需要的依賴都在文件中。帶靜態類型檢驗,現在的第三方包基本上源碼都是,方便查看調試。大型項目首選和結合,代碼調試維護起來極其方便。 showImg(https://segmentfault.com/img/bVbrTKz?w=1400&h=930); 阿特伍德定律,指的是any application that can be wr...
摘要:使用官方的的另外一種版本和一起使用自動配置了一個項目支持。需要的依賴都在文件中。帶靜態類型檢驗,現在的第三方包基本上源碼都是,方便查看調試。大型項目首選和結合,代碼調試維護起來極其方便。 showImg(https://segmentfault.com/img/bVbrTKz?w=1400&h=930); 阿特伍德定律,指的是any application that can be wr...
摘要:多端統一開發框架優秀學習資源匯總官方資源項目倉庫官方文檔項目倉庫官方文檔微信小程序官方文檔百度智能小程序官方文檔支付寶小程序官方文檔字節跳動小程序官方文檔文章教程不敢閱讀包源碼帶你揭秘背后的哲學從到構建適配不同端微信小程序等的應用小程序最 Awesome Taro 多端統一開發框架 Taro 優秀學習資源匯總 showImg(https://segmentfault.com/img/r...
本文收集學習過程中使用到的資源。 持續更新中…… 項目地址 https://github.com/abc-club/f... 目錄 vue react react-native Weex typescript Taro nodejs 常用庫 css js es6 移動端 微信公眾號 小程序 webpack GraphQL 性能與監控 高質文章 趨勢 動效 數據結構與算法 js core 代碼規范...
閱讀 654·2021-11-15 11:39
閱讀 2890·2021-10-08 10:04
閱讀 3252·2019-08-30 10:57
閱讀 3014·2019-08-26 13:25
閱讀 1895·2019-08-26 12:14
閱讀 2626·2019-08-23 15:27
閱讀 2987·2019-08-23 15:18
閱讀 1766·2019-08-23 14:26