React はコンポーネント単位である web ページのHTML、JavaScript、CSSを定義できる JavaScript ライブラリです。
React – ユーザインターフェース構築のための JavaScript ライブラリ
コンポーネント間では Props という仕組みでデータを受け渡します。
チュートリアル:React の導入 – React#データを Props 経由で渡す
これの実装は次の様なコードになります。
// 親コンポーネントで Square を呼び出し, key:len, value: 5 な値を渡す class Board extends React.Component { render() { return <Square len={5} />; } } // 子コンポーネントで this.props.len として渡された値を呼び出す class Square extends React.Component { render() { return ( <button className="square"> {this.props.len} </button> ); } }
React で用いられる JSX 記法とプロパティのつかめないオブジェクト this.props があわさり、両方の実装かコメントを見ないと何が渡され、何を読もうとしているのかわかりません。このままでも動きはしますが開発に時間がかかってしまいます。これを解決する方法の一つが TypeScript による型指定です。
type SquareState = {} type SquareProps = { len: number } class Square extends React.Component<SquareProps,SquareState> { render() { return ( <button className="square"> {this.props.len} </button> ); } }
上記コード例の様に React.Component のジェネリクスに Props と State の型を渡すことで TypeScript として Props と State に関して型チェックが働くようになり、IDE や TypeScript による異常検知や予測補完ができる様になります。
便利ですが時には TypeScript が使えないこともあります。そういった時には prop-types というライブラリが使えます。
facebook/prop-types: Runtime type checking for React props and similar objects
prop-types は React の主要な開発元である Facebook 主導で作られている Props の type を定義するためのライブラリです。これを次の様に静的プロパティとして Component に引っ付けてやれば JavaScript のままでも補完ができる様になります。
import React, {Component} from 'react'; import PropTypes from 'prop-types'; class Square extends Component { // 内部で定義 static propTypes = { len: PropTypes.number.isRequired, } render() { return ( <button className="square"> {this.props.len} </button> ); } } // あるいは class SquareSecond extends Component { render() { return ( <button className="square"> {this.props.len} </button> ); } } // 静的プロパティとして後付けで定義 SquareSecond.propTypes = { len: PropTypes.number.isRequired, } // 呼び出しは素と同じ class Board extends React.Component { render() { return <Square len={5} />; } }
prop-types によって指定できる型は多岐に渡ります。その型の使い方は GitHub の Usage や React 本体のドキュメントに載っています。
facebook/prop-types: Runtime type checking for React props and similar objects#Usage
Typechecking With PropTypes – React