TypeScriptで複数ステップフォームに型を適用する方法!React Hook Form活用ガイド
生徒
「Webサイトで、一度に全部入力するんじゃなくて、次へボタンを押して進む複数ステップのフォームを作りたいんです。でも、TypeScriptで型をどうやって設定すればいいのか分かりません。」
先生
「良い質問ですね。入力項目がページをまたぐと、プログラムが混乱しがちです。そんな時こそTypeScriptの型定義と、React Hook Formという便利なライブラリを組み合わせると解決できます。」
生徒
「ライブラリとか型定義とか、なんだか難しそうです…。」
先生
「大丈夫です。まずは基本の考え方から、一つずつ丁寧に紐解いていきましょう。」
1. 複数ステップフォームとは何か?
複数ステップフォームとは、アンケートや会員登録などでよく見かける、画面を切り替えながら入力を行うフォームのことです。一度に全ての情報を聞くと入力する人は疲れてしまうため、項目をいくつかに分けて表示します。これを実現する際、プログラミングでは今どのステップにいるのか、これまでに入力されたデータはどう保存するのかを厳密に管理しなければなりません。TypeScriptを使う最大のメリットは、このデータをプログラムがしっかりと記憶し、入力漏れやデータの食い違いを防げる点にあります。
2. React Hook Formと型定義の基本
React Hook Formは、Web画面の入力フォームを簡単に管理するための道具箱のようなものです。TypeScriptと組み合わせることで、どの項目にどんな文字が入るべきかを事前決めておくことができます。まずは、フォーム全体のデータの形を定義しましょう。型定義とは、箱の中身のルールを決めることです。例えば、名前は文字の型、年齢は数字の型といったルールをあらかじめ決めておくことで、プログラムが自動的にチェックをしてくれます。
type FormData = {
userName: string;
userAge: number;
userEmail: string;
};
このように、あらかじめデータの形を決めておくことで、間違ったデータが入るのを防ぎ、開発中のミスを大幅に減らすことができます。
3. フォームの各ステップに型を適用する
次に、複数ステップのそれぞれの画面に合わせて型を制限する方法です。全体で必要なデータを一度に全て求めるのではなく、ステップごとに必要な項目だけを抜き出して型を作ると管理が楽になります。これをTypeScriptでは、ピックや部分型といった考え方を使って実現します。ステップ1では名前、ステップ2ではメールアドレスといったように、画面ごとの役割を明確にするのです。
type StepOneData = Pick<FormData, "userName" | "userAge">;
type StepTwoData = Pick<FormData, "userEmail">;
ここで使ったPickという機能は、大きなデータの箱から、必要な項目だけを取り出して新しいルールの箱を作るという指示です。これにより、ステップ1の画面ではメールアドレスを入力する必要がないとプログラムに教えることができます。
4. データの保持とステート管理
複数ステップフォームで一番大切なのは、前の画面で入力したデータを次の画面へ持ち越すことです。これをステート管理と呼びます。ステートとは、今のプログラムが保持している状態のことです。入力したデータを一時的に保存する場所を用意し、最後に入力完了ボタンが押されたときに、全てのデータをまとめて送信します。この時、最初からTypeScriptで定義した型を適用しておくことで、データの持ち越し時に型が崩れるのを防ぐことができます。
5. フォーム入力のバリデーション設定
バリデーションとは、ユーザーが入力した内容が正しい形式かチェックする作業のことです。例えば、メールアドレスの形式が間違っていたり、必須項目が空欄だったりする場合に警告を出します。React Hook Formを使うと、このチェック処理も型定義と合わせて非常にシンプルに書くことができます。これにより、初心者が陥りがちな、予期せぬ入力データによるプログラムの停止を防ぐことができます。
import { useForm } from "react-hook-form";
const { register, handleSubmit } = useForm<FormData>();
このように、ライブラリに対して「先ほど決めたFormDataというルールに従ってチェックしてください」と伝えるだけで、プログラムが自動的にエラーチェックの準備を整えてくれます。
6. TypeScriptで安全なフォーム開発を行うコツ
最後に、より安全で効率的なフォーム開発のために、型を厳格に保つコツをお伝えします。それは、データの型をできるだけ詳しく定義することです。例えば、単なる文字列とするよりも、選択肢がある場合はどれか一つに限定するなど、具体的なルールを設定することで、後からプログラムを直すときも非常に分かりやすくなります。また、ステップごとに型を分割することで、プログラムの機能一つ一つが独立し、どこで問題が起きたのかが見つけやすくなります。TypeScriptを使いこなすことは、最初は難しく感じるかもしれませんが、一度ルールを覚えてしまえば、これほど心強い相棒はいません。
type Gender = "male" | "female" | "other";
type DetailedData = FormData & {
gender: Gender;
};
このように、既存の型に新しい項目を付け足すような柔軟な使い方も可能です。これらの機能を駆使して、安全で使いやすいフォームを作っていきましょう。