Theme
SD MILIEU

2022-2-20

[React] forwardRefのジェネリクスに何を指定すべきか

結論

React.forwardRef<T, P> に関して、

  • T: 親に何のrefを渡すか(aタグなら HTMLAnchorElement
  • P: コンポーネントのProps

を指定すればいい。

詳細

forwardRef の型定義は以下のようになっている。

function forwardRef<T, P = {}>(render: ForwardRefRenderFunction<T, P>): ForwardRefExoticComponent<PropsWithoutRef<P> & RefAttributes<T>>;

forwardRefForwardRefRenderFunction を引数に取り ForwardRefExoticComponent を返す関数。前提としてコンポーネントによってPropsは異なるため、ジェネリクスでPropsに関数情報を渡してあげる必要がある。

で、 RefAttributes の型定義がこれ

interface RefAttributes<T> extends Attributes {
  ref?: Ref<T> | undefined;
}

なので、 T は「何のrefとして扱われるか」ということを示すために使うというのが型定義からわかる。

なのでもう一つの P にPropsを指定するのだと予想できる。実際 PropsWithoutRef<P> にてrefを除いたPropsを取り出していて PropsWithoutRef<P> & RefAttributes<T> とrefと合成して ForwardRefExoticComponent のジェネリクスとして渡している。

まとめ

Reactに限らず、TypeScript対応しているライブラリには「この関数はこう使うんだよ〜」という説明は豊富に書いてくれているが、「このジェネリクスにはこれを指定するんだよ〜」という説明がないので型定義を読まないと意味がわからないことが多くてTypeScriptも大変ではある。(それでもJavaScriptに戻りたいとは全く思わないけど)