技術とかの雑なToday I Learnedメモ

InferGetStaticPropsType は使わないほうがいい?

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 さんがリプライをくれた。

そのあと odan さんもツイートしていた。

props から型を推論するのではなくて props の型を自分で定義して、他の場所で props の型を推論に使わせるほうがいいということっぽい。

props の型は推論させるのではなく定義する、これが大事。

なので InferGetStaticPropsType は実は使わないほうがよさそうじゃない?という話。

今回もらった意見、自分はたしかにそのとおりだなと思ったので使わないようにしようかなと考えているんですが、他の意見も聞いてみたい。

ちなみに今回は never 型になってしまう問題もあって普通に props の型定義をしました。