当 React.Dispatch<React.SetStateAction<string>> 不被接受时,如何为 setState 函数定义 TypeScript 类型?

Posted

技术标签:

【中文标题】当 React.Dispatch<React.SetStateAction<string>> 不被接受时,如何为 setState 函数定义 TypeScript 类型?【英文标题】:How can I define TypeScript type for a setState function when React.Dispatch<React.SetStateAction<string>> not accepted? 【发布时间】:2021-04-25 15:47:56 【问题描述】:

我有一个带有输入元素的 React DatePicker 组件。为了处理 onChange 事件,我定义了 onChangeHandler 函数。但是,当我想在 onChangeHandler 中定义作为参数传递的所有函数的类型时,出现以下错误:

'(value: string) => void' 类型的参数不可分配给 “调度”类型的参数。参数类型 “价值”和“价值”不兼容。类型“SetStateAction”不是 可分配给类型“字符串”。类型 '(prevState: string) => string' 是 不可分配给类型“字符串”.ts(2345

当我将函数定义为“任何”时,此错误消失,但我们当然不希望代码中有任何:)。

以下是我的设置。我的主应用程序中有一个名为 Datepicker 的输入组件,它从主应用程序获取状态。

const [value, setValue] = useState('');

它作为 props 传递到 DatePicker 组件中:

  return (
        <form>
            <label htmlFor="date-picker-input">Date:</label><br />
            **<DatePicker value=value setValue=setValue dateFormat="YYYY/MM/DD" />**
            <button type="submit" value="Submit">Submit</button>
        </form>
);

DatePicker 组件如下所示:

    import onChangeHandler from "../utility/onChangeHandler";

  interface IDatePickerProps 
   applicationMode?: boolean;
   value: string;
   setValue: (value: string) => void;
   dateFormat: DateFormat;  
    
    const DatePicker: React.FC<IDatePickerProps> = (props) => 
           const  value, setValue, dateFormat  = props
           const applicationMode = props.applicationMode ? true : false;
           const [showCalendar, setShowCalendar] = useState(false);
           const [errorMessage, setErrorMessage] = useState("");
           const [clickedDate, setClickedDate] = useState<IClickedDate>();
           const [dateObject, setDateObject] = useState<IDateObject>();
           const [isClicked, setIsClicked] = useState<IIsClicked>();
              //bunch of functions 
        
 return (
    <>
      <div>
        <label htmlFor="date-picker-input aria-label="enter date in the following format">dateFormat</label>
        <button><CalendarIcon /></button>
        <input id="date-picker-input" type="text" value=value
    onChange=(e) => onChangeHandler(e, dateFormat, setValue, setErrorMessage, setClickedDate, 
    setIsClicked) />
      </div>
      <div >
        <MonthPicker/>
        <table>
        <DaysHeading />
        <DatesOfMonth />
        </table>
      </div>
   </> );;

以下是 onChangeHandler 的定义和 setValue 的使用方式:

const onChangeHandler = (
    event: React.ChangeEvent<HTMLInputElement>,
    dateFormat: string,

**//line causing the error is here:**
    setValue: React.Dispatch<React.SetStateAction<string>>,

    setErrorMessage: React.Dispatch<React.SetStateAction<string>>,
    setClickedDate: React.Dispatch<React.SetStateAction<IClickedDate>>,
    setIsClicked: React.Dispatch<React.SetStateAction<IIsClicked>>): void => 

    const value = event.target.value;
    setValue(value);
    let date = "";
    let month = "";
    let year = "";
    let dateFormatCheck;
    let dateIsValid;
    let invalidAt;
    const errorNote = "Please check entered "

    if (value.length === 10) 
        setErrorMessage("");
        if (dateFormat === "YYYY/MM/DD") 
            dateFormatCheck = moment(value, 'YYYY/MM/DD', true);
            dateIsValid = dateFormatCheck.isValid();

            if (dateIsValid === true) 
                //do some stuff
            
            else 
                invalidAt = dateFormatCheck.invalidAt();
                setErrorMessage(errorNote + errorDefinition(invalidAt));
            
        
    //some other validators and no return value
export default onChangeHandler;

【问题讨论】:

【参考方案1】:

您应该将 IDatePickerProps 中的 setValue 类型设置为:

setValue : React.Dispatch<React.SetStateAction<string>>

或者把onChangeHandler里面的setValue改成:

setValue: (value: string) => void;

【讨论】:

悬停在 setValue 上!

以上是关于当 React.Dispatch<React.SetStateAction<string>> 不被接受时,如何为 setState 函数定义 TypeScript 类型?的主要内容,如果未能解决你的问题,请参考以下文章

当react框架遇上百度地图

当扩展与打字稿中的react-final-form FieldRenderProps接口时发生冲突

当 React 组件返回时实际发生了啥?

1. 认识React

1. 认识React

1. 认识React