🙀

【Next.js(v15)】エラー解決法:Type '***' does not satisfy the constraint

2025/03/10に公開

【Next.js 15】エラー解決法:Type error: Type '***' does not satisfy the constraint

Next.js(v15)及び TypeScript でアプリを開発しているのですが、ビルドする際に「Type error: Type '***' does not satisfy the constraint」というエラーによく遭遇しました。同じようなエラーが出てしまった方向けに、解決方法を解説します。

Next.js 15 とは?

Next.js は、React をベースとした Web アプリケーションフレームワークです。サーバーサイドレンダリング(SSR)や静的サイト生成(SSG)など、高度な機能を手軽に実装できるため、多くの開発者に利用されています。

Next.js 15 では、パフォーマンスの向上や開発体験の改善など、さまざまなアップデートが行われました。その中でも特に注目すべきは、App Router 機能(app ディレクトリ) の安定版リリースです。これにより、より柔軟で効率的な開発が可能になりました。

エラー:Type error: Type '***' does not satisfy the constraint

今回解説するエラーは、Next.js 15 で TypeScript を使用している際に、型の制約を満たさない場合に発生します。具体的には、appディレクトリ内のpage.tsxlayout.tsxなどで、props の型定義が正しく行われていない場合に発生することが多いです。

エラー解決例 1:searchParams の型定義

まずは、searchParamsの型定義に関するエラー解決例についてです。

エラーが発生するコード

// app/page.tsx
type HomeProps = {
  searchParams?: { [key: string]: string | string[] | undefined };
};

export default async function Home({ searchParams }: HomeProps) {
  const params = searchParams ?? {};
  // ...
}

上記のコードでは、searchParamsの型定義がPromiseでラップされていないため、エラーが発生します。Next.js 15 では、searchParamsPromiseでラップされた非同期の値として扱われます。

正しいコード

// app/page.tsx
type HomeProps = {
  searchParams?: Promise<{ [key: string]: string | string[] | undefined }>;
};

export default async function Home({ searchParams }: HomeProps) {
  const params = (await searchParams) ?? {};
  // ...
}

上記のコードでは、searchParamsの型定義をPromise<{ [key: string]: string | string[] | undefined }>に変更し、awaitを使用して非同期処理の結果を取得しています。

解説

  • searchParamsは、URL のクエリパラメータを表すオブジェクトです。
  • Next.js 15 では、searchParamsは非同期の値として扱われるため、Promiseでラップする必要があります。
  • awaitを使用することで、Promiseが解決されるまで処理を一時停止し、解決された値を取得できます。
  • ??は、null 合体演算子と呼ばれ、左辺の値がnullまたはundefinedの場合に右辺の値を返します。参考:【JavaScript】null 合体演算子についてまとめてみた

エラー解決例 2:params の型定義

次に、paramsの型定義に関するエラー解決例を見ていきましょう。

エラーが発生するコード

// app/blogs/[id]/page.tsx
type BlogProps = {
  params: { id: string };
};

export default async function Blog({ params }: BlogProps) {
  const { id } = params;
  // ...
}

上記のコードでは、paramsの型定義がPromiseでラップされていないため、エラーが発生します。searchParamsと同様に、paramsも Next.js 15 では非同期の値として扱われます。

正しいコード

// app/blogs/[id]/page.tsx
type BlogProps = {
  params: Promise<{ id: string }>;
};

export default async function Blog({ params }: BlogProps) {
  const { id } = await params;
  // ...
}

上記のコードでは、paramsの型定義をPromise<{ id: string }>に変更し、awaitを使用して非同期処理の結果を取得しています。

解説

  • paramsは、動的なルートパラメータを表すオブジェクトです。
  • searchParamsと同様に、paramsも非同期の値として扱われるため、Promiseでラップする必要があります。
  • awaitを使用することで、Promiseが解決されるまで処理を一時停止し、解決された値を取得できます。

エラー解決のポイント

  • Next.js 15 では、searchParamsparamsなどの props は非同期の値として扱われるため、Promiseでラップする必要があります。
  • awaitを使用して、非同期処理の結果を取得する必要があります。
  • 型定義を正しく行うことで、TypeScript による型チェックを有効活用し、開発効率を向上させることができます。

まとめ

本記事では、Next.js 15 で「Type error: Type '***' does not satisfy the constraint」というエラーが発生した場合の解決方法を解説しました。
Next.js 15 では、App Router の導入により、より柔軟で効率的な開発が可能になりましたが、新しい機能や概念を理解する必要があるため、とても大変です 💦
本記事が、Next.js 15 での開発におけるエラー解決の一助となれば幸いです。

GitHubで編集を提案

Discussion