かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

TypeScript Next.js ESLint NextPage<PageProst> で missing in props validation エラーになる

チーム開発してる Next.js のプロジェクトで ページのコンポーネントの型を PageComponent: NextPage<PagePropsType> = ({ property }) => {} と書くと 'property' is missing in props というエラーが表示されると報告があり調べてたメモ

環境
  • Next.js 13.2.1
  • eslint ^8.34.0
  • typescript 4.9.5

状況

  • Next の PageComponent: PageComponent: NextPage<PagePropsType> => ESLint のエラーになる
  • Next 上で React のコンポーネント: Component: FC<PropsType> => ESLint のエラーにならない

結論: カスタマイズされていた eslint の設定に Next.js の推奨設定が入ってなかったのが原因だった

.eslintrc.js

{
- extends: [
-   "eslint:recommended",
-   "plugin:react/recommended",
-   "prettier",
- ],
- plugins: ["react"],
+ extends: ["next/core-web-vitals", "prettier"]
+ plugins: [],
}

Next.js にデフォルトで用意されている eslint-config-next には eslint-plugin-react, eslint-plugin-react-hooks, eslint-plugin-next が含まれるので react 関連は削除してしまう。 eslint:recommended は残しておいても良いと思うが Next がおすすめの設定を用意してくれているのでそれに乗っかって必要な箇所は rule 付けすれば良いかなという判断をしました


NextPages の型

export type NextPage<Props = {}, InitialProps = Props> = NextComponentType<
  NextPageContext,
  InitialProps,
  Props
>

NextPagesの型は上記のようになっており props の型をジェネリクス (Generic) で書くことは問題無さそう

'property' is missing in props エラーについて

上記のエラーは react/prop-types に依るもので、React でも Arrow 関数でジェネリクス (Generic) を使った場合にこのルールで引数の型がエラーになっていた issueがあったが既に修正されていた。
この修正はあくまで React の FCVFC に対するものだったので FC<PropsType> は問題なく Next.js の NextPage<pagePropsType> でエラーが出ているという状況だった

cf.

感想

エラーが出ているという状況だったので、react/prop-types のルール設定の問題かな〜と GitHub の issue を見てコードまで見に行って調べてたのですが、蓋を開けてみたらカスタマイズされていた ESLint の設定が Next.js 用ではなく React 用になっていたというオチでした。
途中から参加したプロジェクトの設定まわりで問題が起こった時、まだ初期段階ならクリーンな環境を作って設定ファイルの違いを見る事から始めた方が近道そうです… (2時間くらい溶かした…)

おわり


[参考]