【React Hook Form】useFormに渡してはいけない型
投稿日: 2025年04月30日
ハマったので共有します。
配列を直接渡してはいけない
大事なことなのでもう一度。
配列を直接渡してはいけない!!!!
useForm<string[]>
useForm<{obj:string[]}>
内部の処理をリポジトリfork→cloneして確認しました。
props: UseFormProps<TFieldValues, TContext, TTransformedValues> = {}
TFieldValuesを普段型引数として使う、
オプション引数は空のオブジェクト
ここでは問題になりません。エラーも吐かれません。
defaultValues: DefaultValues<TFieldValues> | AsyncDefaultValues<TFieldValues>;
渡した型とdefaultValuesを一致させるだけなので別に問題ないです。
関数も渡せるんですね・・(小声)
ここが心臓部分みたいな処理です。
初期値をここで設定します。
let _defaultValues =
isObject(_options.defaultValues) || isObject(_options.values)
? cloneObject(_options.values || _options.defaultValues) || {}
: {};
import isDateObject from './isDateObject';
import isNullOrUndefined from './isNullOrUndefined';
export const isObjectType = (value: unknown): value is object =>
typeof value === 'object';
export default <T extends object>(value: unknown): value is T =>
!isNullOrUndefined(value) &&
!Array.isArray(value) && //←ここ!!!falseになる
isObjectType(value) &&
!isDateObject(value);
配列をオブジェクトとして扱わないために初期値が空のオブジェクトになっているというわけです。。。
useWatchの中身(/utils/get.ts)もオブジェクトであること前提な処理になっていて、これ以上は確認していないのですが、恐らくセットするときとかもオブジェクト前提になってるんじゃないかなと思いました。
ドキュメントにも「オブジェクト以外渡してくれるな」って書いてあるの見当たらないし時間溶かしました。
ご注意ください。