TypeScript
Next.jsには組み込みのTypeScriptサポートがあり、create-next-app
で新しいプロジェクトを作成すると、必要なパッケージが自動的にインストールされ、適切な設定が行われます。
既存のプロジェクトにTypeScriptを追加するには、ファイルの拡張子を.ts
/.tsx
に変更します。next dev
とnext build
を実行すると、必要な依存関係が自動的にインストールされ、推奨設定を含むtsconfig.json
ファイルが追加されます。
補足: すでに
jsconfig.json
ファイルがある場合は、古いjsconfig.json
からpaths
コンパイラオプションを新しいtsconfig.json
ファイルにコピーし、古いjsconfig.json
ファイルを削除してください。
例
next.config.ts
の型チェック
next.config.ts
を使用して、Next.js設定でTypeScriptを使い、型をインポートすることができます。
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
/* ここに設定オプション */
}
export default nextConfig
補足:
next.config.ts
でのモジュール解決は現在CommonJS
に限定されています。これにより、next.config.ts
で読み込まれるESMのみのパッケージとの非互換性が発生する可能性があります。
next.config.js
ファイルを使用する場合、以下のようにJSDocを使用してIDEで型チェックを追加できます:
// @ts-check
/** @type {import('next').NextConfig} */
const nextConfig = {
/* ここに設定オプション */
}
module.exports = nextConfig
静的生成とサーバーサイドレンダリング
getStaticProps
、getStaticPaths
、getServerSideProps
には、それぞれGetStaticProps
、GetStaticPaths
、GetServerSideProps
の型を使用できます:
import type { GetStaticProps, GetStaticPaths, GetServerSideProps } from 'next'
export const getStaticProps = (async (context) => {
// ...
}) satisfies GetStaticProps
export const getStaticPaths = (async () => {
// ...
}) satisfies GetStaticPaths
export const getServerSideProps = (async (context) => {
// ...
}) satisfies GetServerSideProps
補足:
satisfies
はTypeScriptの4.9で追加されました。最新バージョンのTypeScriptへのアップグレードをお勧めします。
APIルートでの使用
以下はAPIルートで組み込み型を使用する例です:
import type { NextApiRequest, NextApiResponse } from 'next'
export default function handler(req: NextApiRequest, res: NextApiResponse) {
res.status(200).json({ name: 'John Doe' })
}
レスポンスデータの型も指定できます:
import type { NextApiRequest, NextApiResponse } from 'next'
type Data = {
name: string
}
export default function handler(
req: NextApiRequest,
res: NextApiResponse<Data>
) {
res.status(200).json({ name: 'John Doe' })
}
カスタムApp
での使用
カスタムApp
がある場合、組み込み型のAppProps
を使用し、ファイル名を./pages/_app.tsx
に変更できます:
import type { AppProps } from 'next/app'
export default function MyApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />
}
インクリメンタル型チェック
v10.2.1
以降、Next.jsはtsconfig.json
で有効にするとインクリメンタル型チェックをサポートしています。これにより、大規模なアプリケーションでの型チェックの速度を向上させることができます。
本番環境でのTypeScriptエラーの無効化
プロジェクトにTypeScriptエラーがある場合、Next.jsは本番ビルド(next build
)を失敗させます。
アプリケーションにエラーがあっても、Next.jsが危険に本番コードを生成するようにしたい場合は、組み込みの型チェック手順を無効にすることができます。
無効にする場合は、ビルドまたはデプロイプロセスの一部として型チェックを実行していることを確認してください。そうでなければ非常に危険です。
next.config.ts
を開き、typescript
設定でignoreBuildErrors
オプションを有効にします:
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
typescript: {
// !! 警告 !!
// プロジェクトに型エラーがあっても本番ビルドが
// 成功するように危険に許可します。
// !! 警告 !!
ignoreBuildErrors: true,
},
}
export default nextConfig
補足: ビルド前にTypeScriptエラーをチェックするには、
tsc --noEmit
を実行できます。これはデプロイ前にTypeScriptエラーをチェックしたいCI/CDパイプラインで便利です。
カスタム型宣言
カスタム型を宣言する必要がある場合、next-env.d.ts
を変更したくなるかもしれませんが、このファイルは自動生成されるため、変更は上書きされます。代わりに、新しいファイル(例:new-types.d.ts
)を作成し、tsconfig.json
で参照してください:
{
"compilerOptions": {
"skipLibCheck": true
//...省略...
},
"include": [
"new-types.d.ts",
"next-env.d.ts",
".next/types/**/*.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": ["node_modules"]
}
バージョン変更履歴
バージョン | 変更内容 |
---|---|
v15.0.0 | TypeScriptプロジェクト用のnext.config.ts サポートが追加されました。 |
v13.2.0 | 静的に型付けされたリンクがベータ版で利用可能になりました。 |
v12.0.0 | より高速なビルドのためにSWCがデフォルトでTypeScriptとTSXをコンパイルするようになりました。 |
v10.2.1 | tsconfig.json で有効にするとインクリメンタル型チェックのサポートが追加されました。 |