typescript 将react-hook-form的useForm的defaultValues设置为泛型值时发生类型错误

aoyhnmkz  于 7个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(73)

这里是 Backbone.js 示例(您也可以在此codesandbox上找到)

import { FieldValues, useForm } from "react-hook-form";

type FooForm<T> = {
  name: string;
  height: number;
} & T;

type UseFooFormOptions<T> = {
  initialFooForm: FooForm<T>;
};

export const useFooForm = <T extends FieldValues>({
  initialFooForm
}: UseFooFormOptions<T>) => {
  const form = useForm<FooForm<T>>({
    // Type 'FooForm<T>' is not assignable to type 'DefaultValues<FooForm<T>>'.ts(2322)
    defaultValues: initialFooForm
  });

  const someOtherReturns = 5;

  return {
    ...form,
    someOtherReturns
  };
};

字符串
为什么类型FooForm<T>不能赋值给类型DefaultValues<FooForm<T>>?如何修复?

vd2z7a6w

vd2z7a6w1#

变化

type UseFooFormOptions<T> = {
  initialFooForm: FooForm<T>;
};

字符串

import { FieldValues, DefaultValues, useForm } from "react-hook-form";

//...

type UseFooFormOptions<T> = {
  initialFooForm: DefaultValues<FooForm<T>>;
};


useForm期望基本值类型具有应用于defaultValues属性的DefaultValues类型。这是因为defaultValues可以指定值的 * 子集 *,而不是提供所有值。
然而,奇怪的是,FooForm<T>并不是DefaultValues<FooForm<T>>的兼容值。可悲的是,这看起来是因为DeepPartial在库中的实现方式打破了TS在这些类型之间的推理,它在后台使用。
如果你想强制所有的值都提供给initialFooForm,你必须让UseFooFormOptions保持原样,不幸的是,要进行强制转换:

const form = useForm<FooForm<T>>({
    defaultValues: initialFooForm as DefaultValues<FooForm<T>>
  });

相关问题