Next.jsでTypeScriptを導入する手順
Next.jsでTypeScriptを導入する手順
Next.jsでTypeScript環境を導入する手順をまとめます。
1. Next.js インストール
Tutorialの手順(に近い手順)でインストールをします。
※今回は、exampleは指定していません。
npx create-next-app nextjs-blog --use-npm
2. TypeScriptの(自動)設定
TypeScript関連のnpmパッケージをインストールし、空のtsconfig.json
を作成します。
あとは、開発用サーバを立ち上げましょう。
npm install --save-dev typescript @types/react @types/node
touch tsconfig.json
npm run dev
これで、tsconfig.json
が自動的に編集され、next-env.d.ts
が自動で作成されます。
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve"
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}
/// <reference types="next" />
/// <reference types="next/types/global" />
3. tsconfig.jsonの書き換え
自動生成されたtsconfig.json
では、"strict": false
と設定されているため、"strict": true
に修正しておきましょう。
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true, "forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve"
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}
これで、TypeScriptが使えるようになります。
あとは、好みに合わせて修正をしていってください。
自動生成されたjsファイルをts、tsxファイルに修正する
自動生成された表示用のjsファイルをts、tsxファイルに修正しておきましょう。
pages/index.js → index.tsx
「pages」以下の表示用コンポーネントについては、const
で宣言した変数に、React.FC
型を付けておけば大丈夫なようです。
そこで、元々のソースコードを修正していきます。
元々のHome
はfunction
で定義されています。そこで、const
を使った定義に変えて、変数Home
に、関数の型(React.FC
)を付けます。
また、const
宣言だとdefault exportができないので、別途default export
を追加します。
import Head from 'next/head';
import styles from '../styles/Home.module.css';
const Home: React.FC = () => { return (
<div className={styles.container}>
<Head>
<title>Create Next App</title>
<link rel="icon" href="/favicon.ico" />
</Head>
//...
//(略)
//...
<footer className={styles.footer}>
//...
//(略)
//...
</footer>
</div>
);
};
export default Home;
pages/_app.js → _app.tsx
これも、先ほどと同じように、コンポーネントにReact.FC
型を付けます。
なお、「_app.tsx」で作成するコンポーネントは引数を受け取るので、React.FC
の型変数に「引数の型」を指定する必要があります。
そこで、型定義をimportして、引数に型を付けます。
import { AppProps } from 'next/app';import '../styles/globals.css';
const MyApp: React.FC<AppProps> = ({ Component, pageProps }) => { return <Component {...pageProps} />;
};
export default MyApp;
pages/api/hello.js → hello.tsx
型定義をimportして、引数に型を付けます。
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import { NextApiRequest, NextApiResponse } from 'next';
export default (req: NextApiRequest, res: NextApiResponse): void => { res.statusCode = 200;
res.json({ name: 'John Doe' });
};
まとめ
「tsconfig.json」の"strict": true
を、忘れると後が大変そうなので、気を付けましょう。