0Pricing
TypeScript Academy · レッスン

ジェネリックコンポーネントとforwardRef

ジェネリクスを使って再利用可能な型付きコンポーネントを構築します。

「ジェネリックコンポーネントとforwardRef」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

ようこそ

このレッスンでは、ReactでTypeScriptを使用してジェネリックコンポーネントとforwardRefを扱う方法を学びます。

コンポーネントPropsのインターフェース

Reactコンポーネントのpropsインターフェースを定義し、コンポーネントAPIを明文化して、その仕様を保証します。
interface ButtonProps {
  label: string;
  onClick: () => void;
  disabled?: boolean;
}

function Button({ label, onClick, disabled }: ButtonProps) {
  return <button onClick={onClick} disabled={disabled}>{label}</button>;
}

FCと明示的な戻り値の型

React.FCはchildrenなどの型を自動的に追加します。明示的な戻り値の型(JSX.Element | null)のほうが、明確になることが多いです。
const Card: React.FC<{title: string}> = ({ title }) => <div>{title}</div>;

// Or explicit:
function Card2({ title }: { title: string }): JSX.Element {
  return <div>{title}</div>;
}

useStateに型を付ける

useStateは初期値から型を推論します。初期値がnullまたは曖昧な場合は、型パラメーターを指定します。
const [count, setCount] = useState(0);           // number
const [name, setName] = useState('');            // string
const [user, setUser] = useState<User | null>(null); // explicit

useReducerに型を付ける

useReducerには、判別可能なユニオン型のアクション型を使用するのが最適です。
type Action = { type: 'increment' } | { type: 'decrement' } | { type: 'reset'; value: number };
function reducer(state: number, action: Action): number {
  switch (action.type) {
    case 'increment': return state + 1;
    case 'decrement': return state - 1;
    case 'reset': return action.value;
  }
}

DOM用useRefに型を付ける

DOM要素に対するuseRefには型引数が必要です。要素はまだ存在しないため、nullで初期化します。
const inputRef = useRef<HTMLInputElement>(null);

// Use:
if (inputRef.current) {
  inputRef.current.focus();
}

イベントハンドラーに型を付ける

Reactのイベント型には、React.ChangeEvent、React.MouseEvent、React.FormEventがあります。
function handleChange(e: React.ChangeEvent<HTMLInputElement>) {
  console.log(e.target.value);
}
function handleClick(e: React.MouseEvent<HTMLButtonElement>) {
  e.preventDefault();
}

ジェネリックコンポーネント

ジェネリックコンポーネントは型パラメーターを受け取り、柔軟で型安全なリストやセレクトを実現します。
function List<T extends { id: number }>({ items }: { items: T[] }) {
  return <ul>{items.map(i => <li key={i.id}>{JSON.stringify(i)}</li>)}</ul>;
}

TypeScriptでforwardRefを使う

forwardRefには、refの要素型とpropsの両方に型パラメーターが必要です。
const Input = React.forwardRef<HTMLInputElement, InputProps>(
  ({ label, ...props }, ref) => (
    <label>{label}<input {...props} ref={ref} /></label>
  )
);

カスタムフックの戻り値の型

カスタムフックの戻り値を明示的に型付けし、タプルの戻り値がany[]として推論されるのを防ぎます。
function useToggle(init: boolean): [boolean, () => void] {
  const [state, setState] = useState(init);
  return [state, () => setState(s => !s)];
}

TypeScriptでContextを使う

undefinedを含むユニオン型でReact contextに型を付け、利用側でcontextの有無を確認するようにします。
const AuthContext = React.createContext<User | undefined>(undefined);
function useAuth(): User {
  const ctx = useContext(AuthContext);
  if (!ctx) throw new Error('useAuth must be used within AuthProvider');
  return ctx;
}

クイックチェック

HTMLのinput要素へのrefに付ける正しい型は何ですか?

まとめ

Reactのpropsにはインターフェース、useStateには型パラメーター、イベントにはReactのイベント型、refにはDOM要素のジェネリック型、forwardRefには2つの型パラメーターを使用します。ジェネリックコンポーネントにより、型安全で再利用可能なUIを実現できます。

よくある質問

「ジェネリックコンポーネントとforwardRef」レッスンは無料ですか?

はい。「ジェネリックコンポーネントとforwardRef」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「ジェネリックコンポーネントとforwardRef」で何を学びますか?

ジェネリクスを使って再利用可能な型付きコンポーネントを構築します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ジェネリックコンポーネントとforwardRef」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ReactコンポーネントのPropsに型を付ける
  2. useStateとuseReducerに型を付ける
  3. useRefとイベントハンドラーに型を付ける
  4. ジェネリックコンポーネントとforwardRef
← TypeScript Academyに戻る