TypeScript で React コンポーネントのデフォルト値を設定する
React コンポーネントにおける TypeScript でのデフォルトプロパティ値
React コンポーネントにおいて TypeScript を使用することで、プロパティに デフォルト値 を設定することができます。これにより、プロパティが渡されなかった場合でも、コンポーネントは適切に動作します。
基本的な設定
- デフォルト値
プロパティに?
を付けてオプションとし、デフォルト値を設定します。 - プロパティインターフェース
コンポーネントのプロパティを定義するインターフェースを作成します。
interface Props {
name?: string;
age?: number;
}
function MyComponent(props: Props) {
const { name = "Unknown", age = 0 } = props;
// ... コンポーネントのロジック
}
複雑なデフォルト値
- 条件式
条件に基づいてデフォルト値を設定できます。 - 関数
デフォルト値として関数を返すことができます。
interface Props {
items?: string[];
}
function MyComponent(props: Props) {
const { items = ["default item"] } = props;
// ... コンポーネントのロジック
}
型注釈
- 型注釈
デフォルト値の型を明示的に指定できます。
interface Props {
items?: string[];
}
function MyComponent(props: Props) {
const { items = ["default item"] as string[] } = props;
// ... コンポーネントのロジック
}
defaultProps 静的プロパティ
- defaultProps
コンポーネントのクラスに静的なdefaultProps
プロパティを設定できます。
class MyComponent extends React.Component<Props> {
static defaultProps = {
items: ["default item"],
};
// ... コンポーネントのロジック
}
TypeScript の型推論
- 型推論
TypeScript はデフォルト値の型を推論し、適切な型を割り当てます。
interface Props {
items?: string[];
}
function MyComponent(props: Props) {
const { items = [] } = props; // items の型は string[] と推論される
// ... コンポーネントのロジック
}
TypeScript で React コンポーネントのデフォルト値を設定する際のコード例解説
プロパティインターフェースとデフォルト値
interface Props {
name?: string; // ? をつけることでプロパティをオプションにする
age?: number;
}
function MyComponent(props: Props) {
const { name = "Unknown", age = 0 } = props;
return (
<div>
<p>名前: {name}</p>
<p>年齢: {age}</p>
</div>
);
}
- デフォルト値
デストラクチャリング構文を使って、name
にはUnknown
、age
には0
というデフォルト値を割り当てています。これにより、これらのプロパティが渡されなかった場合でも、デフォルト値が表示されます。 - Props インターフェース
Props
インターフェースで、コンポーネントに渡されるプロパティの型を定義します。name
とage
プロパティはオプション(?
)なので、渡されなくてもエラーになりません。
複雑なデフォルト値(関数、条件式)
interface Props {
items?: string[];
}
function MyComponent(props: Props) {
const { items = (() => {
const now = new Date();
return [`Item ${now.getFullYear()}`];
})() } = props;
return (
<ul>
{items.map(item => <li key={item}>{item}</li>)}
</ul>
);
}
- 条件式
デフォルト値を条件に基づいて変更することも可能です。 - 関数によるデフォルト値
items
のデフォルト値として、現在の年を元にアイテムを作成する関数を設定しています。
class MyComponent extends React.Component<Props> {
static defaultProps = {
items: ["default item"],
};
// ... コンポーネントのロジック
}
- クラスコンポーネント
クラスベースのコンポーネントでは、static defaultProps
を使ってデフォルト値を定義します。
interface Props {
items?: string[];
}
function MyComponent(props: Props) {
const { items = [] } = props; // items の型は string[] と推論される
// ... コンポーネントのロジック
}
- 型推論
TypeScript は、右辺の値からitems
の型をstring[]
と推論します。
- 型推論
TypeScript の型推論を活用することで、コードの記述量を減らし、ミスを防ぎます。 - 複雑なロジック
関数や条件式を用いて、より複雑なデフォルト値を設定できます。 - デフォルト値
デストラクチャリング構文やdefaultProps
を使って、プロパティにデフォルト値を設定します。 - インターフェース
Props インターフェースでプロパティの型を定義し、オプション化することで柔軟性を高めます。
これらのテクニックを組み合わせることで、TypeScript で React コンポーネントを開発する際に、より安全で保守性の高いコードを書くことができます。
- 関数コンポーネント
上記の例では関数コンポーネントを使用していますが、クラスコンポーネントでも同様のことができます。 - React.Component
React.Component
は、React クラス型コンポーネントの基底クラスです。 - JSX
上記のコード例では、JSX を使用して React コンポーネントを記述しています。JSX は、JavaScript の構文拡張で、HTML に似た構文で UI を記述することができます。
さらに詳しく知りたい場合は、以下のキーワードで検索してみてください。
- defaultProps
- React props
- JSX
- デストラクチャリング
- TypeScript インターフェース
Optional Chaining (?.)
- 例
- 用途
プロパティが存在しない場合に、undefined または null を返すことで、エラーを回避できます。
interface Props {
user?: { name: string; age: number };
}
function MyComponent(props: Props) {
const { user } = props;
return (
<div>
{user?.name} {user?.age}歳
</div>
);
}
Nullish Coalescing Operator (??)
- 用途
null または undefined の場合にのみデフォルト値を割り当てます。
interface Props {
count?: number;
}
function MyComponent(props: Props) {
const { count } = props;
const displayCount = count ?? 0; // count が null または undefined の場合、0 を代入
return <div>カウント: {displayCount}</div>;
}
Generics
- 用途
汎用的なコンポーネントを作成し、様々な型のプロパティに対応できます。
interface Props<T> {
data?: T;
}
function GenericComponent<T>(props: Props<T>) {
const { data = {} as T } = props;
// ...
}
React Context
- 用途
グローバルな状態を管理し、子コンポーネントにデフォルト値を提供できます。
const ThemeContext = React.createContext({ theme: 'light' });
function MyComponent() {
const { theme } = useContext(ThemeContext);
return <div>テーマ: {theme}</div>;
}
Higher-Order Components (HOC)
- 用途
コンポーネントの機能を拡張し、デフォルト値を提供できます。
function withDefaultProps<P>(Component: React.ComponentType<P>, defaultProps: P) {
return (props: Partial<P>) => <Component {...defaultProps} {...props} />;
}
const MyComponentWithDefaults = withDefaultProps(MyComponent, { name: 'default' });
Custom Hooks
- 用途
複雑なロジックをカプセル化し、再利用可能なカスタムフックとして提供できます。
function useDefaultData<T>(defaultValue: T) {
const [data, setData] = useState<T>(defaultValue);
// ...
return data;
}
選択するべき方法
- カスタムロジック
Custom Hooks - コンポーネントの機能拡張
Higher-Order Components - グローバルな状態管理
React Context - 汎用的なコンポーネント
Generics - 条件分岐
Optional Chaining、Nullish Coalescing Operator - シンプルで静的なデフォルト値
デストラクチャリングやdefaultProps
どの方法を選ぶかは、コンポーネントの構造、データの扱い方、再利用性など、様々な要素によって異なります。
これらの方法を組み合わせることで、より柔軟かつ効率的な React コンポーネントを作成することができます。
- React の機能
React の様々な機能を組み合わせることで、複雑な UI を構築することができます。 - TypeScript の型システム
TypeScript の強力な型システムを活用することで、コードの信頼性を高め、バグを減らすことができます。
reactjs typescript tsx