InferGetStaticPropsType は使わないほうがいい?
7/20に InferGetStaticPropsType のことを書いた。
普通に今日も使っていたのだけど、型の推論がされないところがあったので調べた。
特定の pages のファイルだけなぜか推論が効かず never になり、他のファイルだと特に問題ない。これは一体……?
関係ありそうな部分をちょっとずつ変えていたんだけど、どうやら GetStaticPropsContext
のジェネリクスが問題らしい。
推論されない部分は、
const getStaticProps = async (context: GetStaticPropsContext<ParsedUrlQuery, PreviewData & { hoge: string }) => { ... }
のようにジェネリクスを渡していた。
正しく推論される部分はジェネリクスを渡していない(or 引数を受け取っていない)
Next.jsを10.2へアップデートしたらビルドできなくなったので調査
この記事を見てみると、どうやら previewData の型が any から変わったことによる問題らしい。
のだが、これが InferGetStaticPropsType
の型推論に繋がるかどうかはわからなかった。
似たような問題が提起されている Issue があったので、それをちゃんと読んだらなにか分かるかも知れない(僕はちゃんと読んでないです)
Infer Types leading to `props: never` · Issue #15913 · vercel/next.js
そもそも InferGetStaticPropsType は使うべきではない?
上記の問題をツイートしたら mizchi さんがリプライをくれた。
主従関係的にはprops の型が主でランタイムが従であるべきなので、そもそもああいうものは推論してはいけない、という認識。同じようなもので typeof initialProps から Props を推論してはいけないというやつもある
— mizchi (@mizchi) July 28, 2022
そのあと odan さんもツイートしていた。
型が先、値は後
— odan (@odan3240) July 28, 2022
props から型を推論するのではなくて props の型を自分で定義して、他の場所で props の型を推論に使わせるほうがいいということっぽい。
props の型は推論させるのではなく定義する、これが大事。
なので InferGetStaticPropsType
は実は使わないほうがよさそうじゃない?という話。
今回もらった意見、自分はたしかにそのとおりだなと思ったので使わないようにしようかなと考えているんですが、他の意見も聞いてみたい。
ちなみに今回は never 型になってしまう問題もあって普通に props の型定義をしました。