<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_TSX%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87</id>
	<title>Reactの基礎 - TSXの基本構文 - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_TSX%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_TSX%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87&amp;action=history"/>
	<updated>2026-05-02T14:14:44Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_TSX%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87&amp;diff=14461&amp;oldid=prev</id>
		<title>Wiki: /* 概要 */</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_TSX%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87&amp;diff=14461&amp;oldid=prev"/>
		<updated>2026-02-24T07:12:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;概要&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年2月24日 (火) 16:12時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot;&gt;8行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;8行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* コンポーネントの戻り値やRefの型を明示することで、意図しない使い方を防止できる。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* コンポーネントの戻り値やRefの型を明示することで、意図しない使い方を防止できる。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;React 18以降では &amp;lt;code&amp;gt;React.FC&amp;lt;/code&amp;gt; からchildrenの暗黙的な型定義が削除され、TypeScript 5.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1ではコンポーネントの戻り値型の制約が緩和されるなど、TSXの記述スタイルに関する標準が整理されてきている。&lt;/del&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;React 18以降では &amp;lt;code&amp;gt;React.FC&amp;lt;/code&amp;gt; からchildrenの暗黙的な型定義が削除され、TypeScript 5.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1ではコンポーネントの戻り値型の制約が緩和される等、&amp;lt;br&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;TSXの記述スタイルに関する標準が整理されてきている。&lt;/ins&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mochiu_wiki:diff:1.41:old-14460:rev-14461:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
	<entry>
		<id>https://mochiu.net/index.php?title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_TSX%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87&amp;diff=14460&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == TSX (TypeScript XML) は、ReactアプリケーションをTypeScriptで記述するためのファイル形式 (&lt;code&gt;.tsx&lt;/code&gt;) である。&lt;br&gt; JavaScriptの構文拡張であるJSXに、TypeScriptの静的型付けを組み合わせることで、UIコンポーネントの構造を宣言的に記述しながら、コンパイル時に型の整合性を検証できる。&lt;br&gt; &lt;br&gt; TSXを使用することにより、以下に示すようなメリッ…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_TSX%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87&amp;diff=14460&amp;oldid=prev"/>
		<updated>2026-02-24T07:11:54Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == TSX (TypeScript XML) は、ReactアプリケーションをTypeScriptで記述するためのファイル形式 (&amp;lt;code&amp;gt;.tsx&amp;lt;/code&amp;gt;) である。&amp;lt;br&amp;gt; JavaScriptの構文拡張であるJSXに、TypeScriptの静的型付けを組み合わせることで、UIコンポーネントの構造を宣言的に記述しながら、コンパイル時に型の整合性を検証できる。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; TSXを使用することにより、以下に示すようなメリッ…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
TSX (TypeScript XML) は、ReactアプリケーションをTypeScriptで記述するためのファイル形式 (&amp;lt;code&amp;gt;.tsx&amp;lt;/code&amp;gt;) である。&amp;lt;br&amp;gt;&lt;br /&gt;
JavaScriptの構文拡張であるJSXに、TypeScriptの静的型付けを組み合わせることで、UIコンポーネントの構造を宣言的に記述しながら、コンパイル時に型の整合性を検証できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TSXを使用することにより、以下に示すようなメリットがある。&amp;lt;br&amp;gt;&lt;br /&gt;
* Propsに不正な値を渡した場合にコンパイルエラーとして検出できる。&lt;br /&gt;
* イベントハンドラの引数型が自動推論され、エディタ上で入力補完が効くようになる。&lt;br /&gt;
* コンポーネントの戻り値やRefの型を明示することで、意図しない使い方を防止できる。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
React 18以降では &amp;lt;code&amp;gt;React.FC&amp;lt;/code&amp;gt; からchildrenの暗黙的な型定義が削除され、TypeScript 5.1ではコンポーネントの戻り値型の制約が緩和されるなど、TSXの記述スタイルに関する標準が整理されてきている。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ TSXの基本構文の概要&lt;br /&gt;
! カテゴリ !! 主な構文・型 !! 概要&lt;br /&gt;
|-&lt;br /&gt;
| Propsの型定義 || &amp;lt;code&amp;gt;interface&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || コンポーネントが受け取るPropsの型を定義する&lt;br /&gt;
|-&lt;br /&gt;
| コンポーネント宣言 || &amp;lt;code&amp;gt;React.FC&amp;lt;/code&amp;gt; / 関数宣言 || 型付きコンポーネントの宣言スタイルを使い分ける&lt;br /&gt;
|-&lt;br /&gt;
| 状態管理の型付け || &amp;lt;code&amp;gt;useState&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;useReducer&amp;lt;/code&amp;gt; || 状態とアクションに型を付与して安全に管理する&lt;br /&gt;
|-&lt;br /&gt;
| イベントハンドラの型 || &amp;lt;code&amp;gt;React.MouseEvent&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;React.ChangeEvent&amp;lt;/code&amp;gt; 等 || クリックやフォーム入力等のイベントに型を指定する&lt;br /&gt;
|-&lt;br /&gt;
| Refの型付け || &amp;lt;code&amp;gt;useRef&amp;lt;/code&amp;gt; || DOM要素やミュータブルな値に型を付与して参照する&lt;br /&gt;
|-&lt;br /&gt;
| childrenの型定義 || &amp;lt;code&amp;gt;React.ReactNode&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;PropsWithChildren&amp;lt;/code&amp;gt; || 子要素を受け取るコンポーネントの型を定義する&lt;br /&gt;
|-&lt;br /&gt;
| ジェネリックコンポーネント || 型パラメータ (&amp;lt;code&amp;gt;&amp;amp;lt;T&amp;amp;gt;&amp;lt;/code&amp;gt;) || 型パラメータにより汎用的なコンポーネントを実装する&lt;br /&gt;
|-&lt;br /&gt;
| 型アサーション || &amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt; 構文 || TSXではアングルブラケット構文が使用できないため、&amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt; 構文で型を明示する&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TSXとは ==&lt;br /&gt;
==== JSXからTSXへ ====&lt;br /&gt;
JSXはJavaScriptの構文拡張であり、UI構造をHTMLに近い形で記述できる。&amp;lt;br&amp;gt;&lt;br /&gt;
TSXはこのJSXをTypeScriptで使用するためのファイル形式であり、拡張子は &amp;lt;code&amp;gt;.tsx&amp;lt;/code&amp;gt; となる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.tsx&amp;lt;/code&amp;gt; ファイルでは、TypeScriptの型チェックがJSX構文にも適用されるため、以下に示すような恩恵が得られる。&amp;lt;br&amp;gt;&lt;br /&gt;
* Propsに渡す値の型チェック&lt;br /&gt;
* イベントハンドラの引数型チェック&lt;br /&gt;
* コンポーネントの戻り値の型検証&lt;br /&gt;
* エディタによる補完・リファクタリング支援&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== tsconfig.jsonの設定 ====&lt;br /&gt;
TSXを使用するには、&amp;lt;code&amp;gt;tsconfig.json&amp;lt;/code&amp;gt; の &amp;lt;code&amp;gt;jsx&amp;lt;/code&amp;gt; オプションを適切に設定する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
React 17以降に導入された新しいJSXトランスフォームを利用する場合は、&amp;lt;code&amp;gt;&amp;quot;react-jsx&amp;quot;&amp;lt;/code&amp;gt; を指定する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;compilerOptions&amp;quot;: {&lt;br /&gt;
       &amp;quot;target&amp;quot;: &amp;quot;ES2020&amp;quot;,&lt;br /&gt;
       &amp;quot;lib&amp;quot;: [&amp;quot;ES2020&amp;quot;, &amp;quot;DOM&amp;quot;, &amp;quot;DOM.Iterable&amp;quot;],&lt;br /&gt;
       &amp;quot;module&amp;quot;: &amp;quot;ESNext&amp;quot;,&lt;br /&gt;
       &amp;quot;moduleResolution&amp;quot;: &amp;quot;bundler&amp;quot;,&lt;br /&gt;
       &amp;quot;jsx&amp;quot;: &amp;quot;react-jsx&amp;quot;,&lt;br /&gt;
       &amp;quot;strict&amp;quot;: true,&lt;br /&gt;
       &amp;quot;noUnusedLocals&amp;quot;: true,&lt;br /&gt;
       &amp;quot;noUnusedParameters&amp;quot;: true,&lt;br /&gt;
       &amp;quot;noFallthroughCasesInSwitch&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;include&amp;quot;: [&amp;quot;src&amp;quot;]&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;jsx&amp;quot;: &amp;quot;react-jsx&amp;quot;&amp;lt;/code&amp;gt; を設定すると、各ファイルで &amp;lt;code&amp;gt;import React from &amp;#039;react&amp;#039;&amp;lt;/code&amp;gt; を記述する必要がなくなる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;jsx&amp;quot;: &amp;quot;react&amp;quot;&amp;lt;/code&amp;gt; (旧来の設定) では、全てのTSXファイルにReactのインポートが必要である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 型付きコンポーネントの基本 ==&lt;br /&gt;
==== Propsの型定義 ====&lt;br /&gt;
コンポーネントのPropsは &amp;lt;code&amp;gt;interface&amp;lt;/code&amp;gt; または &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; を使用して定義する。&amp;lt;br&amp;gt;&lt;br /&gt;
コミュニティの標準では、&amp;lt;code&amp;gt;interface&amp;lt;/code&amp;gt; による定義が広く採用されている。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
基本的なPropsの型定義例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface ButtonProps {&lt;br /&gt;
    label: string;&lt;br /&gt;
    onClick: () =&amp;gt; void;&lt;br /&gt;
    disabled?: boolean;&lt;br /&gt;
    variant?: &amp;quot;primary&amp;quot; | &amp;quot;secondary&amp;quot; | &amp;quot;danger&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Button({ label, onClick, disabled = false, variant = &amp;quot;primary&amp;quot; }: ButtonProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;button&lt;br /&gt;
          onClick={onClick}&lt;br /&gt;
          disabled={disabled}&lt;br /&gt;
          className={`btn btn-${variant}`}&lt;br /&gt;
       &amp;gt;&lt;br /&gt;
          {label}&lt;br /&gt;
       &amp;lt;/button&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; を付けたプロパティはオプショナルとなり、省略可能になる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;デフォルト値は関数引数の分割代入で指定する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== React.FC vs 関数宣言 ====&lt;br /&gt;
コンポーネントを定義する方法として、&amp;lt;code&amp;gt;React.FC&amp;lt;/code&amp;gt; (または &amp;lt;code&amp;gt;React.FunctionComponent&amp;lt;/code&amp;gt;) を使用する方法と、通常の関数宣言を使用する方法がある。&amp;lt;br&amp;gt;&lt;br /&gt;
React 18以降、コミュニティの標準は明示的なProps型定義 (通常の関数宣言) に移行している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2つのアプローチを比較する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 // React.FC を使う方法 (React 18以前でよく見られたスタイル)&lt;br /&gt;
 const Greeting: React.FC&amp;lt;{ name: string }&amp;gt; = ({ name }) =&amp;gt; {&lt;br /&gt;
    return &amp;lt;p&amp;gt;Hello, {name}!&amp;lt;/p&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // 推奨: 明示的なProps型定義を使う方法&lt;br /&gt;
 interface GreetingProps {&lt;br /&gt;
    name: string;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Greeting({ name }: GreetingProps) {&lt;br /&gt;
    return &amp;lt;p&amp;gt;Hello, {name}!&amp;lt;/p&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;React.FC&amp;lt;/code&amp;gt; を使わない理由は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
* React 18以降、&amp;lt;code&amp;gt;React.FC&amp;lt;/code&amp;gt; は &amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; を自動的に含まなくなったため、React 17以前との挙動が変わった。&lt;br /&gt;
* ジェネリックコンポーネントに対応しにくい。&lt;br /&gt;
* 通常の関数宣言の方がTypeScriptの型推論との親和性が高い。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 戻り値の型 ====&lt;br /&gt;
コンポーネントの戻り値には &amp;lt;code&amp;gt;JSX.Element&amp;lt;/code&amp;gt; または &amp;lt;code&amp;gt;React.ReactNode&amp;lt;/code&amp;gt; が使用される。&amp;lt;br&amp;gt;&lt;br /&gt;
通常は型推論に任せ、明示的な指定が必要な場合のみ記述する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 // JSX.Element: JSX要素のみを返す場合&lt;br /&gt;
 function Title(): JSX.Element {&lt;br /&gt;
    return &amp;lt;h1&amp;gt;タイトル&amp;lt;/h1&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // React.ReactNode: nullや文字列も返す可能性がある場合&lt;br /&gt;
 function MaybeContent({ show }: { show: boolean }): React.ReactNode {&lt;br /&gt;
    if (!show) return null;&lt;br /&gt;
    return &amp;lt;p&amp;gt;コンテンツ&amp;lt;/p&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 型推論に任せる方法 (推奨)&lt;br /&gt;
 function AutoInferred({ text }: { text: string }) {&lt;br /&gt;
    return &amp;lt;span&amp;gt;{text}&amp;lt;/span&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 状態管理の型付け ==&lt;br /&gt;
==== useStateの型 ====&lt;br /&gt;
&amp;lt;code&amp;gt;useState&amp;lt;/code&amp;gt; は初期値から型を推論できる場合と、明示的に型を指定する必要がある場合がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { useState } from &amp;quot;react&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 interface User {&lt;br /&gt;
    id: number;&lt;br /&gt;
    name: string;&lt;br /&gt;
    email: string;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function UserForm() {&lt;br /&gt;
    // 初期値から型推論が可能なケース&lt;br /&gt;
    const [count, setCount] = useState(0);                // number型&lt;br /&gt;
    const [isLoading, setIsLoading] = useState(false);    // boolean型&lt;br /&gt;
    const [message, setMessage] = useState(&amp;quot;&amp;quot;);           // string型&lt;br /&gt;
 &lt;br /&gt;
    // 明示的な型指定が必要なケース&lt;br /&gt;
    const [user, setUser] = useState&amp;lt;User | null&amp;gt;(null);  // null初期値&lt;br /&gt;
    const [users, setUsers] = useState&amp;lt;User[]&amp;gt;([]);       // 空配列&lt;br /&gt;
    const [selected, setSelected] = useState&amp;lt;number | undefined&amp;gt;(undefined);&lt;br /&gt;
 &lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div&amp;gt;&lt;br /&gt;
          &amp;lt;p&amp;gt;Count: {count}&amp;lt;/p&amp;gt;&lt;br /&gt;
          &amp;lt;button onClick={() =&amp;gt; setCount(count + 1)}&amp;gt;増やす&amp;lt;/button&amp;gt;&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
nullや空配列を初期値として使用する場合は、TypeScriptが型を推論できないため、明示的なジェネリック指定が必要となる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== useReducerの型 ====&lt;br /&gt;
&amp;lt;code&amp;gt;useReducer&amp;lt;/code&amp;gt; では、状態型 (State) とアクション型 (Action) を定義する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
アクション型は判別共用体 (Discriminated Union) を使用して定義するのが推奨パターンである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { useReducer } from &amp;quot;react&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 // 状態の型定義&lt;br /&gt;
 interface CounterState {&lt;br /&gt;
    count: number;&lt;br /&gt;
    step: number;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // アクションの型定義 (判別共用体)&lt;br /&gt;
 type CounterAction =&lt;br /&gt;
    | { type: &amp;quot;increment&amp;quot; }&lt;br /&gt;
    | { type: &amp;quot;decrement&amp;quot; }&lt;br /&gt;
    | { type: &amp;quot;reset&amp;quot; }&lt;br /&gt;
    | { type: &amp;quot;setStep&amp;quot;; payload: number };&lt;br /&gt;
 &lt;br /&gt;
 // reducerの実装&lt;br /&gt;
 function counterReducer(state: CounterState, action: CounterAction): CounterState {&lt;br /&gt;
    switch (action.type) {&lt;br /&gt;
       case &amp;quot;increment&amp;quot;:&lt;br /&gt;
          return { ...state, count: state.count + state.step };&lt;br /&gt;
       case &amp;quot;decrement&amp;quot;:&lt;br /&gt;
          return { ...state, count: state.count - state.step };&lt;br /&gt;
       case &amp;quot;reset&amp;quot;:&lt;br /&gt;
          return { ...state, count: 0 };&lt;br /&gt;
       case &amp;quot;setStep&amp;quot;:&lt;br /&gt;
          return { ...state, step: action.payload };&lt;br /&gt;
       default:&lt;br /&gt;
          return state;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Counter() {&lt;br /&gt;
    const [state, dispatch] = useReducer(counterReducer, { count: 0, step: 1 });&lt;br /&gt;
 &lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div&amp;gt;&lt;br /&gt;
          &amp;lt;p&amp;gt;Count: {state.count} (Step: {state.step})&amp;lt;/p&amp;gt;&lt;br /&gt;
          &amp;lt;button onClick={() =&amp;gt; dispatch({ type: &amp;quot;increment&amp;quot; })}&amp;gt;+&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;button onClick={() =&amp;gt; dispatch({ type: &amp;quot;decrement&amp;quot; })}&amp;gt;-&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;button onClick={() =&amp;gt; dispatch({ type: &amp;quot;reset&amp;quot; })}&amp;gt;リセット&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;button onClick={() =&amp;gt; dispatch({ type: &amp;quot;setStep&amp;quot;, payload: 5 })}&amp;gt;Step: 5&amp;lt;/button&amp;gt;&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
判別共用体を使用することにより、各アクションの &amp;lt;code&amp;gt;payload&amp;lt;/code&amp;gt; に対する型チェックが正確に機能する。&amp;lt;br&amp;gt;&lt;br /&gt;
例えば、&amp;lt;code&amp;gt;setStep&amp;lt;/code&amp;gt; アクションでは &amp;lt;code&amp;gt;payload&amp;lt;/code&amp;gt; が必須となり、他のアクションでは不要であることを型として表現できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イベントハンドラの型 ==&lt;br /&gt;
==== 一般的なイベント型 ====&lt;br /&gt;
Reactは、DOMイベントをラップした独自のSyntheticEvent型を提供している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
下表に、主なイベント型を示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Reactの主なイベント型&lt;br /&gt;
! イベント型 !! 対象要素の例 !! 用途&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.ChangeEvent&amp;amp;lt;HTMLInputElement&amp;amp;gt;&amp;lt;/code&amp;gt; || input, textarea, select || 入力値の変更&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.MouseEvent&amp;amp;lt;HTMLButtonElement&amp;amp;gt;&amp;lt;/code&amp;gt; || button, div, span || マウスクリック・移動&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.FormEvent&amp;amp;lt;HTMLFormElement&amp;amp;gt;&amp;lt;/code&amp;gt; || form || フォーム送信&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.KeyboardEvent&amp;amp;lt;HTMLInputElement&amp;amp;gt;&amp;lt;/code&amp;gt; || input, textarea || キーボード入力&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.FocusEvent&amp;amp;lt;HTMLInputElement&amp;amp;gt;&amp;lt;/code&amp;gt; || input, select || フォーカスの取得・喪失&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.DragEvent&amp;amp;lt;HTMLDivElement&amp;amp;gt;&amp;lt;/code&amp;gt; || div, img || ドラッグ&amp;amp;ドロップ&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.WheelEvent&amp;amp;lt;HTMLDivElement&amp;amp;gt;&amp;lt;/code&amp;gt; || div, canvas || マウスホイール&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== イベントハンドラ関数の型定義 ====&lt;br /&gt;
イベントハンドラは、JSX属性のインライン定義と、別途関数として定義する2つの方法がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { useState } from &amp;quot;react&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 function Form() {&lt;br /&gt;
    const [inputValue, setInputValue] = useState(&amp;quot;&amp;quot;);&lt;br /&gt;
    const [isSubmitted, setIsSubmitted] = useState(false);&lt;br /&gt;
 &lt;br /&gt;
    // 関数として型を明示して定義&lt;br /&gt;
    const handleChange = (event: React.ChangeEvent&amp;lt;HTMLInputElement&amp;gt;) =&amp;gt; {&lt;br /&gt;
       setInputValue(event.target.value);&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    const handleSubmit = (event: React.FormEvent&amp;lt;HTMLFormElement&amp;gt;) =&amp;gt; {&lt;br /&gt;
       event.preventDefault();&lt;br /&gt;
       setIsSubmitted(true);&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    const handleKeyDown = (event: React.KeyboardEvent&amp;lt;HTMLInputElement&amp;gt;) =&amp;gt; {&lt;br /&gt;
       if (event.key === &amp;quot;Enter&amp;quot;) {&lt;br /&gt;
          console.log(&amp;quot;Enterキーが押されました:&amp;quot;, inputValue);&lt;br /&gt;
       }&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    const handleButtonClick = (event: React.MouseEvent&amp;lt;HTMLButtonElement&amp;gt;) =&amp;gt; {&lt;br /&gt;
       console.log(&amp;quot;クリック位置:&amp;quot;, event.clientX, event.clientY);&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;form onSubmit={handleSubmit}&amp;gt;&lt;br /&gt;
          &amp;lt;input&lt;br /&gt;
             type=&amp;quot;text&amp;quot;&lt;br /&gt;
             value={inputValue}&lt;br /&gt;
             onChange={handleChange}&lt;br /&gt;
             onKeyDown={handleKeyDown}&lt;br /&gt;
             placeholder=&amp;quot;テキストを入力&amp;quot;&lt;br /&gt;
          /&amp;gt;&lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; onClick={handleButtonClick}&amp;gt;&lt;br /&gt;
             送信&lt;br /&gt;
          &amp;lt;/button&amp;gt;&lt;br /&gt;
          {isSubmitted &amp;amp;&amp;amp; &amp;lt;p&amp;gt;送信されました: {inputValue}&amp;lt;/p&amp;gt;}&lt;br /&gt;
       &amp;lt;/form&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントオブジェクトを使用しない場合は、引数の型注釈を省略しても型推論が機能する。&amp;lt;br&amp;gt;&lt;br /&gt;
しかし、イベントオブジェクトのプロパティ (例: &amp;lt;code&amp;gt;event.target.value&amp;lt;/code&amp;gt;) にアクセスする場合は、明示的な型指定が必要となる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Refの型付け ==&lt;br /&gt;
==== useRefの型 ====&lt;br /&gt;
&amp;lt;code&amp;gt;useRef&amp;lt;/code&amp;gt; には、DOM要素への参照と、ミュータブルな値の保持という2つの用途がある。&amp;lt;br&amp;gt;&lt;br /&gt;
それぞれで型の指定方法が異なる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { useRef, useEffect } from &amp;quot;react&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 function InputWithFocus() {&lt;br /&gt;
    // DOM要素への参照: 初期値はnull、型引数にHTML要素型を指定&lt;br /&gt;
    const inputRef = useRef&amp;lt;HTMLInputElement&amp;gt;(null);&lt;br /&gt;
    const divRef = useRef&amp;lt;HTMLDivElement&amp;gt;(null);&lt;br /&gt;
 &lt;br /&gt;
    // ミュータブル値の保持: 初期値が null の場合&lt;br /&gt;
    const timerIdRef = useRef&amp;lt;number | null&amp;gt;(null);&lt;br /&gt;
    const renderCountRef = useRef&amp;lt;number&amp;gt;(0);&lt;br /&gt;
 &lt;br /&gt;
    useEffect(() =&amp;gt; {&lt;br /&gt;
       // DOM参照はnullチェックが必要&lt;br /&gt;
       if (inputRef.current) {&lt;br /&gt;
          inputRef.current.focus();&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
       // ミュータブル値はnullチェック不要 (初期値が0の場合)&lt;br /&gt;
       renderCountRef.current += 1;&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
    const startTimer = () =&amp;gt; {&lt;br /&gt;
       timerIdRef.current = window.setTimeout(() =&amp;gt; {&lt;br /&gt;
          console.log(&amp;quot;タイマー発火&amp;quot;);&lt;br /&gt;
       }, 1000);&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    const stopTimer = () =&amp;gt; {&lt;br /&gt;
       if (timerIdRef.current !== null) {&lt;br /&gt;
          clearTimeout(timerIdRef.current);&lt;br /&gt;
          timerIdRef.current = null;&lt;br /&gt;
       }&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div ref={divRef}&amp;gt;&lt;br /&gt;
          &amp;lt;input ref={inputRef} type=&amp;quot;text&amp;quot; placeholder=&amp;quot;フォーカスされます&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;button onClick={startTimer}&amp;gt;タイマー開始&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;button onClick={stopTimer}&amp;gt;タイマー停止&amp;lt;/button&amp;gt;&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DOM要素への参照では &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; を初期値とし、使用時に &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; チェックを行う。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;ミュータブル値では、値の型に合わせた初期値を設定する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== childrenの型 ==&lt;br /&gt;
==== React.ReactNode ====&lt;br /&gt;
&amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; プロパティの型として最も汎用的なのが &amp;lt;code&amp;gt;React.ReactNode&amp;lt;/code&amp;gt; である。&amp;lt;br&amp;gt;&lt;br /&gt;
文字列、数値、JSX要素、配列、null、undefined など、レンダリング可能なあらゆる値を受け付ける。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { ReactNode } from &amp;quot;react&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 interface CardProps {&lt;br /&gt;
    title: string;&lt;br /&gt;
    children: ReactNode;&lt;br /&gt;
    footer?: ReactNode;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Card({ title, children, footer }: CardProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div className=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div className=&amp;quot;card-header&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;h2&amp;gt;{title}&amp;lt;/h2&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div className=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
             {children}&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          {footer &amp;amp;&amp;amp; (&lt;br /&gt;
             &amp;lt;div className=&amp;quot;card-footer&amp;quot;&amp;gt;&lt;br /&gt;
                {footer}&lt;br /&gt;
             &amp;lt;/div&amp;gt;&lt;br /&gt;
          )}&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 使用例&lt;br /&gt;
 function App() {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;Card&lt;br /&gt;
          title=&amp;quot;ユーザー情報&amp;quot;&lt;br /&gt;
          footer={&amp;lt;button&amp;gt;編集&amp;lt;/button&amp;gt;}&lt;br /&gt;
       &amp;gt;&lt;br /&gt;
          &amp;lt;p&amp;gt;名前: 山田 太郎&amp;lt;/p&amp;gt;&lt;br /&gt;
          &amp;lt;p&amp;gt;メール: yamada@example.com&amp;lt;/p&amp;gt;&lt;br /&gt;
       &amp;lt;/Card&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;React.ReactNode&amp;lt;/code&amp;gt; はJSX要素だけでなく、文字列や数値も受け付けるため、柔軟なコンポーネント設計が可能となる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== PropsWithChildren ====&lt;br /&gt;
&amp;lt;code&amp;gt;React.PropsWithChildren&amp;lt;/code&amp;gt; は、既存のProps型に &amp;lt;code&amp;gt;children?: ReactNode&amp;lt;/code&amp;gt; を追加するユーティリティ型である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
React 17以前に &amp;lt;code&amp;gt;React.FC&amp;lt;/code&amp;gt; と組み合わせて使われていたパターンだが、現在は明示的に &amp;lt;code&amp;gt;children: ReactNode&amp;lt;/code&amp;gt; を定義する方が推奨されている。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { PropsWithChildren, ReactNode } from &amp;quot;react&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 // 推奨: childrenを明示的に定義する方法&lt;br /&gt;
 interface LayoutProps {&lt;br /&gt;
    title: string;&lt;br /&gt;
    children: ReactNode;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Layout({ title, children }: LayoutProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div&amp;gt;&lt;br /&gt;
          &amp;lt;h1&amp;gt;{title}&amp;lt;/h1&amp;gt;&lt;br /&gt;
          &amp;lt;main&amp;gt;{children}&amp;lt;/main&amp;gt;&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 非推奨: PropsWithChildrenを使う方法 (React 17以前のスタイル)&lt;br /&gt;
 interface OldLayoutProps {&lt;br /&gt;
    title: string;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function OldLayout({ title, children }: PropsWithChildren&amp;lt;OldLayoutProps&amp;gt;) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div&amp;gt;&lt;br /&gt;
          &amp;lt;h1&amp;gt;{title}&amp;lt;/h1&amp;gt;&lt;br /&gt;
          &amp;lt;main&amp;gt;{children}&amp;lt;/main&amp;gt;&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;PropsWithChildren&amp;lt;/code&amp;gt; を使用せずに明示的に定義するメリットは、以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; が必須か任意かをコントロールできる。&lt;br /&gt;
* Props型を見るだけで &amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; の存在が明確に分かる。&lt;br /&gt;
* ソースコードの意図が明示的になる。&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ジェネリックコンポーネント ==&lt;br /&gt;
==== 型パラメータを持つコンポーネント ====&lt;br /&gt;
コンポーネントに型パラメータを持たせることにより、汎用的な再利用可能なコンポーネントを定義できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; 宣言とアロー関数では、ジェネリックの記述方法が異なる琴に注意が必要である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { ReactNode } from &amp;quot;react&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 // function宣言によるジェネリックコンポーネント&lt;br /&gt;
 interface ListProps&amp;lt;T&amp;gt; {&lt;br /&gt;
    items: T[];&lt;br /&gt;
    renderItem: (item: T, index: number) =&amp;gt; ReactNode;&lt;br /&gt;
    keyExtractor: (item: T) =&amp;gt; string;&lt;br /&gt;
    emptyMessage?: string;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function List&amp;lt;T&amp;gt;({ items, renderItem, keyExtractor, emptyMessage = &amp;quot;データがありません&amp;quot; }: ListProps&amp;lt;T&amp;gt;) {&lt;br /&gt;
    if (items.length === 0) {&lt;br /&gt;
       return &amp;lt;p&amp;gt;{emptyMessage}&amp;lt;/p&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;ul&amp;gt;&lt;br /&gt;
          {items.map((item, index) =&amp;gt; (&lt;br /&gt;
             &amp;lt;li key={keyExtractor(item)}&amp;gt;&lt;br /&gt;
                {renderItem(item, index)}&lt;br /&gt;
             &amp;lt;/li&amp;gt;&lt;br /&gt;
          ))}&lt;br /&gt;
       &amp;lt;/ul&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // アロー関数によるジェネリックコンポーネント&lt;br /&gt;
 // .tsx ファイルでは &amp;lt;T&amp;gt; が JSX タグと誤認されるため、&amp;lt;T,&amp;gt; とカンマが必要&lt;br /&gt;
 const SelectBox = &amp;lt;T extends { id: string; label: string },&amp;gt;(&lt;br /&gt;
    props: {&lt;br /&gt;
       options: T[];&lt;br /&gt;
       value: string;&lt;br /&gt;
       onChange: (value: string) =&amp;gt; void;&lt;br /&gt;
    }&lt;br /&gt;
 ) =&amp;gt; {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;select value={props.value} onChange={(e) =&amp;gt; props.onChange(e.target.value)}&amp;gt;&lt;br /&gt;
          {props.options.map((option) =&amp;gt; (&lt;br /&gt;
             &amp;lt;option key={option.id} value={option.id}&amp;gt;&lt;br /&gt;
                {option.label}&lt;br /&gt;
             &amp;lt;/option&amp;gt;&lt;br /&gt;
          ))}&lt;br /&gt;
       &amp;lt;/select&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // 使用例&lt;br /&gt;
 interface User {&lt;br /&gt;
    id: string;&lt;br /&gt;
    name: string;&lt;br /&gt;
    email: string;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function UserList() {&lt;br /&gt;
    const users: User[] = [&lt;br /&gt;
       { id: &amp;quot;1&amp;quot;, name: &amp;quot;山田 太郎&amp;quot;, email: &amp;quot;yamada@example.com&amp;quot; },&lt;br /&gt;
       { id: &amp;quot;2&amp;quot;, name: &amp;quot;佐藤 花子&amp;quot;, email: &amp;quot;sato@example.com&amp;quot; },&lt;br /&gt;
    ];&lt;br /&gt;
 &lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;List&lt;br /&gt;
          items={users}&lt;br /&gt;
          keyExtractor={(user) =&amp;gt; user.id}&lt;br /&gt;
          renderItem={(user) =&amp;gt; (&lt;br /&gt;
             &amp;lt;span&amp;gt;{user.name} ({user.email})&amp;lt;/span&amp;gt;&lt;br /&gt;
          )}&lt;br /&gt;
       /&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;アロー関数でジェネリックを使う場合の &amp;lt;code&amp;gt;&amp;amp;lt;T,&amp;amp;gt;&amp;lt;/code&amp;gt; というカンマは、TSXファイルにおいてJSXタグと区別するために必要な構文である。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;extends&amp;lt;/code&amp;gt; 制約を使うと、型パラメータが特定のプロパティを持つことを保証できる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 型アサーションとTSX ==&lt;br /&gt;
==== as構文の使用 ====&lt;br /&gt;
TypeScriptでは、型アサーションに2種類の構文がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;TSXファイルではアングルブラケット構文 (&amp;lt;code&amp;gt;&amp;amp;lt;Type&amp;amp;gt;value&amp;lt;/code&amp;gt;) がJSXタグと競合するため使用できない。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;代わりに &amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt; 構文を使用する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 // 通常の.tsファイルでは両方使用可能&lt;br /&gt;
 // アングルブラケット構文 (TSXファイルでは使用不可)&lt;br /&gt;
 // const element = &amp;lt;HTMLInputElement&amp;gt;document.getElementById(&amp;quot;input&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 // as構文 (TSXファイルで使用する方法)&lt;br /&gt;
 const element = document.getElementById(&amp;quot;input&amp;quot;) as HTMLInputElement;&lt;br /&gt;
 &lt;br /&gt;
 // as構文の様々な使用例&lt;br /&gt;
 function processData(data: unknown) {&lt;br /&gt;
    // unknown型から特定の型へのアサーション&lt;br /&gt;
    const user = data as { name: string; age: number };&lt;br /&gt;
    console.log(user.name);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // イベントターゲットへのアサーション&lt;br /&gt;
 function handleChange(event: React.ChangeEvent&amp;lt;HTMLInputElement&amp;gt;) {&lt;br /&gt;
    const target = event.target as HTMLInputElement;&lt;br /&gt;
    console.log(target.value);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // constアサーション (リテラル型を保持)&lt;br /&gt;
 const directions = [&amp;quot;up&amp;quot;, &amp;quot;down&amp;quot;, &amp;quot;left&amp;quot;, &amp;quot;right&amp;quot;] as const;&lt;br /&gt;
 type Direction = typeof directions[number]; // &amp;quot;up&amp;quot; | &amp;quot;down&amp;quot; | &amp;quot;left&amp;quot; | &amp;quot;right&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 interface DirectionButtonProps {&lt;br /&gt;
    direction: Direction;&lt;br /&gt;
    onClick: (direction: Direction) =&amp;gt; void;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function DirectionButton({ direction, onClick }: DirectionButtonProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;button onClick={() =&amp;gt; onClick(direction)}&amp;gt;&lt;br /&gt;
          {direction}&lt;br /&gt;
       &amp;lt;/button&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // satisfies演算子 (TypeScript 4.9以降): 型チェックしつつ型推論を保持&lt;br /&gt;
 const config = {&lt;br /&gt;
    apiUrl: &amp;quot;https://api.example.com&amp;quot;,&lt;br /&gt;
    timeout: 5000,&lt;br /&gt;
    retries: 3,&lt;br /&gt;
 } satisfies Record&amp;lt;string, string | number&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
型アサーションは型システムを迂回する操作であるため、過度な使用は避けるべきである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;型ガード (type guard) や 型推論で対応できる場合は、そちらを優先する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連情報 ==&lt;br /&gt;
* [[Reactの基礎 - JSXの基本構文]]&lt;br /&gt;
* [[Reactの基礎 - コンポーネント]]&lt;br /&gt;
* [[Reactの基礎 - PropsとChildren]]&lt;br /&gt;
* [[Reactの基礎 - 条件レンダリング]]&lt;br /&gt;
* [[Reactの基礎 - リストレンダリング]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板,React,TypeScript,TSX,JSX,Props,型定義,ジェネリック,イベントハンドラ,useState,useReducer,useRef,children,ReactNode,コンポーネント,フロントエンド&lt;br /&gt;
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:Rust]][[カテゴリ:Web]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>