Next.js のApp RouterでREST APIを作る時は、型定義にPromiseをお忘れなく
この記事では、Next.jsのApp Routerを使用してREST APIを作成する際のTypeScript型定義に関するTipsが紹介されています。パスパラメータを受け取るAPIを想定し、v15以降でのビルドエラー回避方法やコードの変更点が説明されています。Page RouterやRemixに慣れている人も戸惑うかもしれないが、理解すれば問題ない内容です。
広告ここから
広告ここまで
目次
この記事は、Next.jsのApp RouterでREST APIを作る時のTypeScript型定義に関するTipsを紹介する、「Next.js Advent Calendar 2024」6日目の記事です。
App RouterでREST APIを作成する
/:line/:dayType
のような、パスパラメータを受け取るAPIを作る場合を想像しましょう。Page Routerなどで開発されたことがある方は、このような型定義を作られるかと思います。
export async function GET(
request: NextRequest,
context: { params: { line: string; dayType: string; } }
): Promise<NextResponse> {
try {
const {
line,
dayType,
} = context.params;
しかしこの型定義ですと、v15以降ではビルドエラーが発生します。
Failed to compile.
src/app/api/trains/[line]/[dayType]/route.ts
Type error: Route "src/app/api/trains/[line]/[dayType]/route.ts" has an invalid "GET" export:
Type "{ params: { line: string; dayType: string; }; }" is not a valid type for the function's second argument.
context.params
はPromise
になっている
ビルドエラーが起きない書き方はこちらです。パスパラメータのオブジェクト型がPromise
になっています。それに伴い、値を取得する際もconst { line } = context.params
からconst { line } = await context.params
と変わっています。
export async function GET(
request: NextRequest,
context: { params: Promise<{ line: string; dayType: string; }> }
): Promise<NextResponse> {
try {
const {
line,
dayType,
} = await context.params;
まとめ
一度違いを理解してしまえばなんということはないのですが、Page RouterやRemixに慣れているとちょっと戸惑うかなと思います。自分もおそらく何回かこのミスをやらかす予感がしているため、こうやって覚書として記録します。