将 react-hook-form 的 useForm 的 defaultValues 设置为通用值时出现类型错误

Type error from setting defaultValues of react-hook-form's useForm to a generic value

提问人:Changdae Park 提问时间:11/11/2023 更新时间:11/11/2023 访问量:24

问:

下面是主干示例(你也可以在这个代码沙箱上找到它)

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
  };
};

为什么 type 不能分配给 type?我该如何解决?FooForm<T>DefaultValues<FooForm<T>>

打字稿 react-hook-form

评论


答:

1赞 adsy 11/11/2023 #1

改变

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

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

//...

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

useForm期望基值类型具有应用于属性的类型。这是因为可以指定值的子集,而不是提供所有值。DefaultValuesdefaultValuesdefaultValues

但是,奇怪的是,因此不是 的兼容值。可悲的是,这看起来像是因为在库中实现的方式打破了 TS 在这些类型之间的推理,它在引擎盖下使用了这些类型。FooForm<T>DefaultValues<FooForm<T>>DeepPartial

如果你想强制提供所有值,你必须保持原样,不幸的是,做一个强制转换:initialFooFormUseFooFormOptions

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