prop-types は生の JavaScript で React コンポーネントに渡される props の型を定義するためのライブラリです。JavaScript のみの開発環境において TypeScript の代替になります。
facebook/prop-types: Runtime type checking for React props and similar objects
これは次の様に props を定義できます。、オブジェクト、配列、関数といった複雑な構造をした props の型を決定する方法を紹介しします。
component.propTypes = {
label: PropTypes.string.isRequired,
name: PropTypes.string,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
};
一番頼りになる使い方ドキュメントは GitHub リポジトリの Usage です。この記事になくても大体ここにあります。
facebook/prop-types: Runtime type checking for React props and similar objects#usage
オブジェクトと配列は次の様に記述できます。
memberComponent.propTypes = {
member: PropTypes.shape({
id: PropTypes.number,
name: PropTypes.string,
// shape でオブジェクト定義
imageUrls: PropTypes.shape({
// arrayOf で配列定義
profile: PropTypes.arrayOf(PropTypes.string),
avater: PropTypes.arrayOf(PropTypes.string),
}),
// shape, arrayOf どちらも PropTypes をネストできる
tickets: PropTypes.arrayOf(PropTypes.shape({
ticketToken: PropTypes.string,
status: PropTypes.number,
createdAt: PropTypes.string,
updatedAt: PropTypes.string,
})),
}),
}
記述量がいささか手間ですがこれで複雑な構造体も把握できます。
積極的に作るほどではないですが関数の定義もできます。
component.propTypes = {
// 単に関数であるとするだけなら func のみで十分
onChange: PropTypes.func,
// カスタムバリデーションと JavaScript の関数はオブジェクトという特性を絡めます
onClick : (props, propName, componentName) => {
const fn = props[propName];
// typeof で型が分かり、function の length は引数
if((typeof fn !== 'function' || fn.length !== 2)) {
return new Error(propName + 'は引数が二つの関数です');
}
}
}
返り値の検査の仕方は分かりませんでしたが(素のJavaScriptでは関数定義時点で未定義っぽいので無理な気がします)、引数だけでも助けになります。