React PropType 配列とshape 解説
ReactでPropTypeの配列とshape
Reactにおけるproptypeは、コンポーネントに渡されるプロパティの型やバリデーションを定義するための仕組みです。この中で、配列とshapeを組み合わせることで、より複雑なプロパティ構造を指定することができます。
基本的な使い方
import PropTypes from 'prop-types';
function MyComponent({ items }) {
// ...
}
MyComponent.propTypes = {
items: PropTypes.arrayOf(
PropTypes.shape({
id: PropTypes.number.isRequired,
name: PropTypes.string.isRequired,
})
).isRequ ired,
};
PropTypes.string.isRequired
:name
プロパティは必須で、文字列型であることを指定します。PropTypes.shape()
: オブジェクトの構造を指定します。PropTypes.arrayOf()
: 配列であることを指定します。
意味と利点
このコードは、MyComponent
に渡されるitems
プロパティが、オブジェクトの配列であることを要求しています。さらに、配列内の各オブジェクトは、id
とname
というプロパティを持ち、それらは必須で数値型または文字列型である必要があります。
これにより、コンポーネントの受け取るデータの構造を明確にし、バグやエラーを防ぐことができます。
具体的な例
const items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
];
<MyComponent items={items} />
この場合、items
プロパティは指定された構造に合致するため、コンポーネントは正常にレンダリングされます。しかし、items
が配列でない、または配列内のオブジェクトが指定された構造に合わない場合、エラーが発生します。
import PropTypes from 'prop-types';
function MyComponent({ items }) {
// ...
}
MyComponent.propTypes = {
items: PropTypes.arrayOf(
PropTypes.shape({
id: PropTypes.number.isRequired,
name: PropTypes.string.isRequired,
})
).isRequ ired,
};
const items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
];
<MyComponent items={items} />
- itemsプロパティ
- 配列である。
- 各要素はオブジェクトである。
- 各オブジェクトは
id
とname
のプロパティを持つ。 id
は数値型で必須。name
は文字列型で必須。
解説
他の例
// 配列内のオブジェクトに別のプロパティを追加
PropTypes.shape({
id: PropTypes.number.isRequired,
name: PropTypes.string.isRequired,
isActive: PropTypes.bool, // Optional
});
// 配列の要素が別の型でも許容
PropTypes.arrayOf(
PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
])
);
TypeScript
- インターフェイス
インターフェイスを使用して、オブジェクトの構造を定義することができます。 - 型推論
TypeScriptは多くの場合、型を自動的に推論します。 - 静的型付け
TypeScriptはJavaScriptのスーパーセットで、静的型付けをサポートします。これにより、コンパイル時に型のエラーを検出することができます。
例
interface Item {
id: number;
name: string;
}
function MyComponent({ items }: { items: Item[] }) {
// ...
}
PropTypesの代替ライブラリ
- Yup
Yupはまた別のスキーマ検証ライブラリです。 - Zod
Zodは強力なスキーマ検証ライブラリです。
import { z } from 'zod';
const itemSchema = z.object({
id: z.number(),
name: z.string(),
});
const MyComponent = ({ items }) => {
// ...
z.array(itemSchema).parse(items);
};
カスタムフック
- バリデーションロジック
カスタムフック内でバリデーションロジックを実装し、コンポーネントから分離することができます。 - カスタムフック
Reactの機能を再利用可能なユニットとしてカプセル化します。
import { useState } from 'react';
function useValidateItems(items) {
const [isValid, setIsValid] = useState(true);
// バリデーションロジック
if (!Array.isArray(items) || items.some(item => !item.id || !item.name)) {
setIsValid(false);
}
return isValid;
}
function MyComponent({ items }) {
const isValid = useValidateItems(items);
// ...
}
カスタムコンポーネント
- プロパティバリデーション
カスタムコンポーネント内でプロパティのバリデーションを実装することができます。 - カスタムコンポーネント
特定の機能や表示をカプセル化します。
function ItemList({ items }) {
// バリデーションロジック
if (!Array.isArray(items) || items.some(item => !item.id || !item.name)) {
return <div>Invalid items</div>;
}
// ...
}
arrays reactjs react-proptypes