Повторная проверка формы для массива полей в TypeScript

#reactjs #typescript #validation #redux #redux-form

#reactjs #typescript #проверка #уменьшает #повторная форма

Вопрос:

Я впервые внедряю FieldArray из redux-form, и пользовательский интерфейс работает нормально (хотя, похоже, есть некоторые общие последствия, которые я еще не диагностировал). Идея заключается в том, что вы нажимаете кнопку «ДОБАВИТЬ», чтобы добавить в форму еще одну «комнату», которая является просто текстовым полем (игнорируйте компонент кнопки, это пользовательский компонент)

Однако код проверки не компилируется. Кажется, я сталкиваюсь с типами и не уверен, как правильно это сделать в typescript. Я использую руководство из этого примера о том, как выполнить проверку, но этот пример является чистым javascript.

Ошибка заключается в:

 Type '{ _error: string; }' is not assignable to type 'string | ReactElement<any, string | ((props: any) => ReactElement<any, string | ... | (new (props: any) => Component<any, any, any>)> | null) | (new (props: any) => Component<any, any, any>)> | undefined'.
  

Вот метод, который отображает fieldarray:

 const renderRoomNames = (fieldProps: WrappedFieldArrayProps<string>) => (
    <Grid container spacing={4}>
      {fieldProps.fields.map((name: string, index: number) => {
        console.log('room - name', name);
        return (
          <Grid item xs={12} key={`gridroom${index   1}`}>

            <Field            
              name={`${name}`}
              type="text"
              label={"Room "   (index   1)}
              placeholder={`Enter a name for this room`}
              component={ReduxFormTextField}       
              required={true}
              disabled={isSuccessful}
              fullWidth      
            />
     
          </Grid>
      )})}
      <Grid item xs={12}>
        <StandardButtonBase
          variant="contained"
          color="primary"
          startIcon={<AddIcon />}
          align="right"
          disableTooltip={true}
          round={true}
          onClick={() => fieldProps.fields.push('')}
          buttonText="Add Room"
        />
        {fieldProps.meta.submitFailed amp;amp; fieldProps.meta.error amp;amp; <span>{fieldProps.meta.error}</span>}
      </Grid>
    </Grid>
  )

return (
   <FieldArray name="roomNames" component={renderRoomNames} />
)
  

И код проверки:

 export const requestVirtualClinicFormDataValidator = (
  model?: IModel
): FormErrors<IModel> => {
  const errors: FormErrors<IModel> = {};

  if (!model) {
    errors._error = 'SNIP';
    return errors;
  }

  // General room name errors checked first
  if (isEmpty(model.roomNames) || model.roomNames.length === 0) {
    errors.roomNames = 'You require at least one room '
  } else if (model.roomNames.some((x) => isEmpty(x))) {
    errors.roomNames = { _error: 'All room names must have a value' };
  } else {
    // Specific individual room name checks second
    const roomNameErrors:any[] = [];

    if (model.roomNames.length === 1 amp;amp; isEmpty(model.roomNames[0])) {
      roomNameErrors[0] = { _error: 'You must provide a name for your room' };     
    } else {        
      for (let i=0; i < model.roomNames.length; i  ) {
        const roomName = model.roomNames[i];
        const count = model.roomNames.filter(x => x.toLowerCase() === roomName.toLowerCase()).length;
        if (count > 1) {
          roomNameErrors[i] = { _error: 'All rooms must have a unique name' }
        }
      }
      
      if (roomNameErrors amp;amp; roomNameErrors.length > 0) {
        errors.roomNames = roomNameErrors;
      }
    }
  }

  return errors;
};
  

Проблема заключается в компиляции. Ему не нравится _error: часть, ему нужна прямая строка.

Однако это также не позволит использовать строку errors.roomNames = roomNameErrors; , если оставить roomNameErrors в виде массива строк. Это вместо этого приводит к этой ошибке:

 Type 'string[]' is not assignable to type 'string | ReactElement<any, string | ((props: any) => ReactElement<any, string | ... | (new (props: any) => Component<any, any, any>)> | null) | (new (props: any) => Component<any, any, any>)> | undefined'.
  

Кажется, что, хотя свойство ‘roomNames’ в моей модели является строковым массивом, определение типа для этого требует только компонента react или string. Как мне передать обратно ошибки проверки для данного поля в массиве полей, используя typescript? Приведенный ранее пример просто не передает типизацию typescript, поскольку они в настоящее время настроены.

Использование redux-формы 8.2.

Ответ №1:

Я обнаружил, что определения типов действительно были неправильными. Переключив ошибки с FormErrors на type Any, все это скомпилировалось и фактически заработало. Я зарегистрирую проблему с определенно введенным репозиторием, чтобы исправить это.

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

1. Привет, спасибо за ваш собственный ответ. Если бы у вас было время разместить проблему на Github, вы могли бы связать ее здесь? Спасибо!