Как правильно объявить эту функцию prop?

#reactjs #typescript

#reactjs #typescript

Вопрос:

Привет, я новичок в typescript, и в моем проекте есть 2 компонента: диалоговое окно ввода и компонент меню настроек. Я использую inputDialog внутри settingmenu компонента

мой компонент диалогового окна ввода выглядит следующим образом

 interface InputDialogContentProps {
  inputLabel: string;
  inputType: string;
  onChange?: any;
}

export default function InputDialogContent(props: InputDialogContentProps) {
  const classes = inputDialogStyle();

  return (
    <DialogContent className={classes.dialogContentPlacement}>
      <TextField
        autoFocus
        className={classes.textFieldStyle}
        margin="dense"
        id="name"
        label={props.inputLabel}
        type={props.inputType}
        onChange={props.onChange}
        fullWidth
      />
    </DialogContent>
  

Пожалуйста, обратите внимание, что я объявляю об изменении, как any в этом компоненте.

вот мой документ меню настроек.

 <InputDialogContent
            inputLabel="Email Address"
            inputType="email"
            onChange={onInputChange}
          />

function onInputChange(e: React.ChangeEvent<HTMLTextAreaElement>) {
    setEnableLoginButton(isValidEmail(e.target.value));
  }
  

Как вы можете видеть, я использую onChange для отслеживания изменений внутри текстовой области html.
Итак, вместо any того, как правильно объявить это Onchange внутри компонента InputDialog

Ответ №1:

Это было бы:

 interface InputDialogContentProps {
  inputLabel: string;
  inputType: string;
  onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
  

Это функция, которая принимает один параметр типа React.ChangeEvent<HTMLTextAreaElement> и ничего не возвращает. Общая форма:

 (parameters) => returnType;
  

Подробнее в руководстве по машинописи.

Комментарии:

1. Разве это невозможно просто сделать onChange?: ReturnType<typeof React.ChangeEvent<HTMLTextAreaElement>>; ?

2. @Joel — Я не понимаю, что вы пытаетесь там сделать ( это работает не так, как показано ), но тип в ответе — это простой, прямой способ сделать это.

3. codesandbox.io/s/react-typescript-playground-forked-rke63?file =/… вот так.

4. это работа. const onInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => { //do something console.log(e.target.value); };

5. @T.J.Crowder Но да, мне было в основном любопытно, можно ли сделать это каким-либо другим способом, но вы правы, я поторопился, мой пример просто приводит в исполнение событие, которое возвращается void .