我有一个函数,它返回一个input元素及其相应的属性,该属性基于接收onChange事件的函数。该功能在组件 prop 中被接收。问题是,我无法键入函数接收到HTMLInputElement、HTMLSelectElement或HTMLTextareaElement的ChangeEvent的情况。
type OptionsProps = {
description: string;
value: string;
};
type SelectProps = {
handleChange: ({ target }: React.ChangeEvent<HTMLSelectElement>) => void;
value: string;
options: OptionsProps;
};
type TextareaProps = {
handleChange: ({ target }: React.ChangeEvent<HTMLTextAreaElement>) => void;
cols?: number;
rows?: number;
};
type InputProps = {
handleChange: ({ target }: React.ChangeEvent<HTMLInputElement>) => void;
} & (InputNumberProps | InputTextProps | InputFileProps);
type Props = {
title: string;
name: string;
htmlFor: string;
} & (InputProps | TextareaProps | SelectProps);
export const ModalFormDivider = (props: Props) => {
const { title, name, htmlFor, handleChange} = props;
const determineElement = () => {
switch (handleChange) {
case (({ target }: React.ChangeEvent<HTMLSelectElement>) => void): {...Do something}
case (({ target }: React.ChangeEvent<HTMLTextareaElement>) => void): {...Do other thing}
case (({ target }: React.ChangeEvent<HTMLSelectElement>) => void): {...Do whatever}
}
};
}
字符串
我试着把编辑器说handleChange是(({ target }:例如,React.ChangeEvent)=> void),但它不起作用。
1条答案
按热度按时间bprjcwpo1#
首先让我们看看switch语句的定义。
字符串
switch
语句计算expression/value
,然后将计算结果与case
子句的expression/value
进行比较。与初始expression/value
匹配的case
子句的代码块将最终成为结果。在您的示例中,您将
type
作为case
值传递,这将不起作用,因为类型不是有效的expression/value
下面是你正在做的事情的分解:
型
这实际上应该在IDE中抛出一个错误,如:
型
如果你真的想这样做,你可以在switch语句中比较函数,但这需要函数调用签名不同。
型
我认为你真正想做的是使用一个generic,它将帮助你在
ModalFormDivider
组件用法中正确地键入handleChange
函数。您还需要添加一个type
prop来选择要返回的元素。这更符合(我认为)你正在努力做的事情。的字符串
希望这对你有帮助!