🛡️

React Hook FormのstandardSchemaResolverを使えばzod v4に対応できるよ

に公開

今年の2月にReact Hook FormStandard Schemaに対応しました。

https://github.com/react-hook-form/resolvers/pull/738

Standard Schemaの導入により、React Hook Formは特定のバリデーションライブラリに依存せず、標準化されたインターフェースを通して柔軟に連携できるようになりました。

zod v4がReact Hook Formで動かない問題

React Hook Formとzodを組み合わせて使う際には、zodResolverを使うのが一般的ですが、残念ながらこのzodResolverはまだzod v4に対応していません。

https://github.com/react-hook-form/resolvers/issues/768

例えば、次のようなコードを書くと、以下のような型エラーが発生します。

import { zodResolver } from '@hookform/resolvers/zod';
import { useForm } from 'react-hook-form';
import { z } from 'zod/v4'; // zod@^3.25.0

const formSchema = z.object({
  name: z.string(),
});

export function Form() {
  const {register} = useForm({
    resolver: zodResolver(formSchema),
    defaultValues: {
      name: '',
    },
  });

  return <input {...register('name')} />;
}

解決策:standardSchemaResolver を使おう

このようなzod v4との互換性の問題に対しては、standardSchemaResolverを使用することで解決できます。

import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';
import { useForm } from 'react-hook-form';
import { z } from 'zod/v4';

const formSchema = z.object({
  name: z.string(),
});

export function Form() {
  const { register } = useForm({
    resolver: standardSchemaResolver(formSchema),
    defaultValues: {
      name: '',
    },
  });

  return <input {...register('name')} />;
}

standardSchemaResolverはStandard Schemaを準拠しており、zodの内部実装に依存しないため、zod v4におけるような破壊的変更の影響を受けません(zodがStandard Schemaのサポートを辞めた時には影響を受けますが)。そのため、React Hook Form側の対応を待たずにzod v4に移行を始めることができます。

おわり

TSKaigiでStandard Schemaの紹介スライドがありましたが、ライブラリの破壊的変更にも強くなるよ、ということが言いたくて書きました。

Standard Schemaについてわかりやすく解説されているのでまだ見てない方はぜひご覧ください↓
https://speakerdeck.com/nozomuikuta/standard-schema-sukimaraiburarinotong-qi-hua-tohahe-ka

Discussion