TypeScript
Next.jsは、Reactアプリケーションを構築するための、TypeScriptを最優先とした開発体験を提供します。
必要なパッケージを自動的にインストールし、適切な設定を構成する、組み込みのTypeScriptサポートが付属しています。
さらに、エディター用のTypeScriptプラグインも提供しています。
🎥 視聴: 組み込みのTypeScriptプラグインについて学ぶ → YouTube (3分)
新規プロジェクト
create-next-app
は現在、デフォルトでTypeScriptを同梱しています。
既存プロジェクト
ファイルを.ts
/.tsx
に名前変更することで、TypeScriptをプロジェクトに追加できます。next dev
とnext build
を実行すると、必要な依存関係が自動的にインストールされ、推奨される設定オプションを持つtsconfig.json
ファイルが追加されます。
すでにjsconfig.json
ファイルがある場合は、古いjsconfig.json
からコンパイラオプションのpaths
を新しいtsconfig.json
ファイルにコピーし、古いjsconfig.json
ファイルを削除してください。
さらに、型推論を改善するために、next.config.js
の代わりにnext.config.ts
の使用をお勧めします。
TypeScriptプラグイン
Next.jsには、VSCodeやその他のコードエディターが高度な型チェックと自動補完に使用できる、カスタムTypeScriptプラグインと型チェッカーが含まれています。
VS Codeでプラグインを有効にするには:
- コマンドパレットを開く(
Ctrl/⌘
+Shift
+P
) - 「TypeScript: Select TypeScript Version」を検索
- 「Use Workspace Version」を選択
これで、ファイルを編集する際にカスタムプラグインが有効になります。next build
を実行する際は、カスタム型チェッカーが使用されます。
プラグインの機能
TypeScriptプラグインは以下を支援できます:
- セグメント設定オプションに不適切な値が渡された場合に警告する。
- 利用可能なオプションとコンテキスト内のドキュメントを表示する。
use client
ディレクティブが正しく使用されていることを確認する。- クライアントフック(
useState
など)がClient Componentsでのみ使用されていることを確認する。
補足: 今後さらに機能が追加される予定です。
最小TypeScriptバージョン
型修飾子付きインポート名やパフォーマンス改善などの構文機能を利用するために、TypeScriptのv4.5.2
以上を強くお勧めします。
Next.js設定での型チェック
next.config.jsの型チェック
next.config.js
ファイルを使用する場合、以下のようにJSDocを使用してIDEで型チェックを追加できます:
next.config.tsの型チェック
next.config.ts
を使用することで、TypeScriptを使い、型をNext.js設定にインポートできます。
注意:
next.config.ts
でのモジュール解決は現在、CommonJS
に限定されています。これにより、next.config.ts
にロードされるESMのみのパッケージとの間に非互換性が生じる可能性があります。
静的に型付けされたリンク
Next.jsは、next/link
を使用する際の誤字やその他のエラーを防ぐために、リンクを静的に型付けすることができ、ページ間のナビゲーション時の型安全性を向上させます。
この機能を有効にするには、experimental.typedRoutes
を有効にし、プロジェクトがTypeScriptを使用している必要があります。
Next.jsは.next/types
内にリンク定義を生成します。これには、アプリケーション内のすべての既存ルートに関する情報が含まれており、TypeScriptはこれを使用して、無効なリンクについてエディター内でフィードバックを提供できます。
現在、実験的なサポートには任意の文字列リテラル(動的セグメントを含む)が含まれます。非リテラル文字列の場合、現在はhref
をas Route
でキャストする必要があります:
next/link
をラップするカスタムコンポーネントでhref
を受け入れるには、ジェネリックを使用します:
どのように動作するか?
next dev
またはnext build
を実行すると、Next.jsは.next
内に隠れた.d.ts
ファイルを生成します。このファイルには、アプリケーション内のすべての既存ルートに関する情報(Link
のhref
型として有効なすべてのルート)が含まれています。この.d.ts
ファイルはtsconfig.json
に含まれ、TypeScriptコンパイラはその.d.ts
をチェックし、エディター内で無効なリンクについてフィードバックを提供します。
エンドツーエンドの型安全性
Next.jsのApp Routerには強化された型安全性があります。これには以下が含まれます:
- フェッチ関数とページ間のデータのシリアライズなし: サーバー上のコンポーネント、レイアウト、ページで直接
fetch
できます。このデータをクライアント側で消費するためにシリアライズ(文字列に変換)する必要はありません。代わりに、app
はデフォルトでServer Componentsを使用するため、Date
、Map
、Set
などの値を追加手順なしで使用できます。以前は、Next.js固有の型を使用してサーバーとクライアント間の境界を手動で型付けする必要がありました。 - コンポーネント間のデータフローの合理化:
_app
の削除により、コンポーネントとページ間のデータフローを簡単に可視化できるようになりました。以前は、個々のpages
と_app
間のデータフローの型付けが難しく、紛らわしいバグを引き起こす可能性がありました。App Routerのデータ取得の共配置により、これはもはや問題ではありません。
Next.jsのデータ取得は、データベースやコンテンツプロバイダーの選択に関して限定的にならずに、可能な限りエンドツーエンドの型安全性に近づいています。
通常のTypeScriptと同様に、レスポンスデータを型付けできます。例:
完全なエンドツーエンドの型安全性を実現するには、データベースやコンテンツプロバイダーもTypeScriptをサポートしている必要があります。これは、ORMや型安全なクエリビルダーを使用することで可能になります。
非同期サーバーコンポーネントのTypeScriptエラー
async
サーバーコンポーネントをTypeScriptで使用するには、TypeScript 5.1.3
以降と@types/react
18.2.8
以降を使用していることを確認してください。
古いバージョンのTypeScriptを使用している場合、'Promise<Element>' is not a valid JSX element
というタイプエラーが表示されることがあります。最新バージョンのTypeScriptと@types/react
に更新することで、この問題は解決されるはずです。
サーバーとクライアントコンポーネント間のデータ受け渡し
サーバーとクライアントコンポーネント間でpropsを介してデータを受け渡す場合、データはブラウザで使用するためにシリアライズ(文字列に変換)されます。ただし、特別な型を必要としません。コンポーネント間で他のpropsを渡すのと同じように型付けされます。
さらに、レンダリングされていないデータはサーバーとクライアント間を移動しない(サーバー上に残る)ため、シリアライズされるコードは少なくなります。これはサーバーコンポーネントのサポートによって初めて可能になりました。
パスエイリアスと baseUrl
Next.jsは自動的に tsconfig.json
の "paths"
および "baseUrl"
オプションをサポートします。
この機能の詳細は モジュールパスエイリアスのドキュメント を参照してください。
増分型チェック
v10.2.1
以降、Next.jsは tsconfig.json
で有効にされた場合、増分型チェックをサポートします。これは大規模なアプリケーションでの型チェックを高速化するのに役立ちます。
TypeScriptエラーの無視
Next.jsは、プロジェクト内にTypeScriptエラーがある場合、本番ビルド(next build
)を失敗させます。
アプリケーションにエラーがある場合でも、Next.jsに危険に生成コードを生成させたい場合は、組み込みの型チェックステップを無効にできます。
無効にする場合は、ビルドまたはデプロイプロセスの一部として型チェックを確実に実行してください。そうでない場合、非常に危険になる可能性があります。
next.config.ts
を開き、typescript
設定の ignoreBuildErrors
オプションを有効にします:
補足:
tsc --noEmit
を実行して、ビルド前にTypeScriptエラーを自分でチェックできます。これは、デプロイ前にTypeScriptエラーをチェックしたいCI/CDパイプラインで役立ちます。
カスタム型宣言
カスタム型を宣言する必要がある場合、next-env.d.ts
を変更したくなるかもしれません。ただし、このファイルは自動生成されるため、変更した内容は上書きされます。代わりに、new-types.d.ts
などの新しいファイルを作成し、tsconfig.json
で参照する必要があります:
バージョンの変更
バージョン | 変更点 |
---|---|
v15.0.0 | TypeScriptプロジェクト用の next.config.ts サポートが追加されました。 |
v13.2.0 | 静的に型付けされたリンクがベータで利用可能になりました。 |
v12.0.0 | より高速なビルドのため、SWC がデフォルトでTypeScriptとTSXをコンパイルするようになりました。 |
v10.2.1 | tsconfig.json で有効にされた場合、増分型チェックのサポートが追加されました。 |