我已经创建了一个通用的useForm.tsx文件来处理onChange事件.然而,对于 Select 控件onChange,我得到了下面的错误.

你知道我怎么才能解决这个问题吗?

Error:

Type '(e: ChangeEvent<HTMLInputElement | HTMLSelectElement>) => void' is not assignable to type '(event: SelectChangeEvent<string>, child: ReactNode) => void'.
  Types of parameters 'e' and 'event' are incompatible.
    Type 'SelectChangeEvent<string>' is not assignable to type 'ChangeEvent<HTMLInputElement | HTMLSelectElement>'.
      Type 'Event & { target: { value: string; name: string; }; }' is missing the following properties from type 'ChangeEvent<HTMLInputElement | HTMLSelectElement>': nativeEvent, isDefaultPrevented, isPropagationStopped, persistts(2322)
Select.tsx(19, 3): The expected type comes from property 'onChange' which is declared here on type 'IntrinsicAttributes & Props'

useForm.tsx code:

 import { ChangeEvent, useState } from 'react';

 interface FormFieldInitialValues {
   [key: string]: string;
 }

 const useForm = (formFieldInitialValues: FormFieldInitialValues) => {
   const [values, setValues] = useState<FormFieldInitialValues>(
   formFieldInitialValues
 );

 const handleInputChange = (
   e: ChangeEvent<HTMLInputElement | HTMLSelectElement>
 ) => {
   const { name, value } = e.target;
   setValues({
     ...values,
     [name]: value,
   });
 };

  return {
   values,
   setValues,
   handleInputChange,
  };
 };

export default useForm;

My Select control code:

<Controls.Select
   name="classSelect"
   label="Class"
   value={values.classSelect}
   onChange={handleInputChange}   -> shows an error here
   options={GetClassesService()}
></Controls.Select>

但是,相同的代码可以很好地用于输入控件.

 <Controls.Input
   name="lastName"
   label="Last Name"
   value={values.lastName}
   onChange={handleInputChange}
 />

感谢任何人的帮助.

谢谢.

推荐答案

从错误中看,您似乎正在使用MUI,并且它们的event对象的类型与标准的Reaction事件不同.
该错误告诉您

参数‘e’和‘Event’的类型不兼容.类型‘SelectChangeEvent’不可分配给类型‘ChangeEvent<;HTMLInputElement|HTMLSelectElement>;’.

import { SelectChangeEvent } from "@mui/material";
//...
const handleInputChange = (
   e: SelectChangeEvent<unknown>
 ) => {
  const { name, value } = e.target; // you may need a cast here
  setValues({
    ...values,
    [name]: value,
  });
};

Typescript相关问答推荐

使用前的组件渲染状态更新

ReturnType此索引方法与点表示法之间的差异

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

如果存在ts—mock—imports,我们是否需要typescpt中的IoC容器

如何推断哪个特定密钥与泛型匹配?

如何缩小变量访问的对象属性范围?

在动态对话框中使用STEP组件实现布线

Vue SFC中的多个脚本块共享导入的符号

获取函数中具有动态泛型的函数的参数

通过按键数组拾取对象的关键点

嵌套对象的类型

从对象类型描述生成类型

React router 6(数据路由)使用数据重定向

是否可以强制静态方法将同一类型的对象返回其自己的类?

避免混淆两种不同的ID类型

如何在打字角react 式中补齐表格组

如何使用警告实现`RecursiveReadonly<;T>;`,如果`T`是原语,则返回`T`而不是`RecursiveReadonly<;T>;`

基于可选参数的动态类型泛型类型

当并非所有歧视值都已知时,如何缩小受歧视联盟的范围?

是否有可能不允许在 TypeScript 中设置类属性,但也会抛出运行时错误?