收到错误:

TS2345: Argument of type 'string' is not assignable to parameter of type '"firstName" | "lastName" | "email" | "password" | "location"'.

父零部件:

<InputElement
  id="First Name"
  name="firstName"
  type="text"
  label="First Name"
  register={register}
  rules={{ required: "First name is required." }}
  error={errors.firstName}
 />

子InputElement组件:

import { InputHTMLAttributes } from "react";
import { UseFormRegister, FieldError, FieldValues } from "react-hook-form";

interface SignUpFields {
  firstName: string;
  lastName: string;
  email: string;
  password: string;
  location: string;
}

interface InputElementProps extends InputHTMLAttributes<HTMLInputElement> {
  label?: string;
  labelClasses?: string;
  register: UseFormRegister<SignUpFields>;
  rules: FieldValues;
  error?: FieldError;
}

export function InputElement({
  label,
  labelClasses,
  register,
  rules,
  error,
  ...props
}: InputElementProps) {
  const name = { ...props }["name"];
  console.log(name); // This properly console logs "firstName"

  return (
    <div className="mt-6">
      {label && (
        <label
          htmlFor={{ ...props }["id"]}
          className={`block text-primary text-sm font-medium font-montserrat leading-6 ${labelClasses}`}
        >
          {label}
        </label>
      )}
      <input
        {...props}
        {...register(name, rules)}
        className="mt-2 mb-1 bg-transparent active:bg-transparen focus:bg-transparent block w-full rounded-xl   border-2 border-primary px-4 py-2 font-montserrat text-lg text-white placeholder:text-white sm:text-sm sm:leading-6"
      />
      {error && (
        <p className="text-white text-xs font-montserrat mt-1 italic">
          {error.message}
        </p>
      )}
    </div>
  );
}

错误在此行上,名称为:

{...register(name, rules)}

如果我手动添加字符串:

{...register("firstName", rules)}

它工作得很好,但我在一个表单中多次使用这个组件,所以它需要是动态的.

这是我的第一个打字作业(job),这个错误令人困惑,我似乎找不到与我类似的问题.

如有任何帮助/建议,我们将不胜感激.

推荐答案

当您在REACT-HOOK-FORM中指定SignUpFields接口时,注册名称只接受SignUpFields个键作为联合类型. 例如:

let name: 'Bob' | 'Alis'
name = 'Dany' // it will be type error, because name only can be 'Bob' or 'Alis'

因此,对于您的代码,您需要将InputElement的props name‘S类型设置为keyof SignUpFields

Typescript相关问答推荐

React-Native运行方法通过监听另一个状态来更新一个状态

处理API响应中的日期对象

为什么typescript不能推断类的方法返回类型为泛型''

`((PrevState:NULL)=>;NULL)|null`是什么意思?

为什么TypeScript失go 了类型推断,默认为any?''

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

以Angular 自定义快捷菜单

使用Redux Saga操作通道对操作进行排序不起作用

在类型脚本中创建泛型类型以动态追加属性后缀

如何通过TypeScrip中的函数防止映射类型中未能通过复杂推理的any值

有没有一种方法可以确保类型的成员实际存在于TypeScript中的对象中?

(TypeScript)TypeError:无法读取未定义的属性(正在读取映射)"

如何在React组件中指定forwardRef是可选的?

RXJS将对键盘/鼠标点击组合做出react

如何使用TypeScrip在EXPO路由链路组件中使用动态路由?

使用RXJS获取数据的3种不同REST API

必须从注入上下文调用Angular ResolveFn-inject()

断言同级为true或抛出错误的Typescript函数

元组解释

如何判断路由或其嵌套路由是否处于活动状态?