Reactjs TypeScript中FieldArray的Redux表单验证

Reactjs TypeScript中FieldArray的Redux表单验证,reactjs,typescript,validation,redux,redux-form,Reactjs,Typescript,Validation,Redux,Redux Form,我第一次从redux表单实现了一个FieldArray,UI工作得很好(尽管似乎有一些性能方面的问题我还没有诊断出来)。其思想是,单击一个添加按钮,将另一个“房间”添加到表单中,它只是一个文本字段(忽略按钮组件,它是一个自定义组件) 但是,验证代码不会编译。我似乎在类型上有冲突,不确定用typescript做这件事的正确方法。我使用的是来自的关于如何进行验证的指导,但这个示例是纯javascript的 错误是: Type '{ _error: string; }' is not assignab

我第一次从redux表单实现了一个FieldArray,UI工作得很好(尽管似乎有一些性能方面的问题我还没有诊断出来)。其思想是,单击一个添加按钮,将另一个“房间”添加到表单中,它只是一个文本字段(忽略按钮组件,它是一个自定义组件)

但是,验证代码不会编译。我似乎在类型上有冲突,不确定用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'.
看起来,即使我的模型上的“roomNames”属性是一个字符串数组,该属性的类型定义只需要react组件或字符串。如何使用typescript返回字段数组中给定字段的验证失败?前面链接的示例无法传递当前设置的typescript键入


使用redux form 8.2.

我发现类型定义确实是错误的。
通过将错误从FormErrors切换到Any类型,所有的错误都被编译并实际工作了。我将用明确键入的回购记录一个问题以解决此问题。

您好,谢谢您的回答。如果你有时间把这个问题放到Github上,你能把它链接到这里吗?谢谢!
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 && fieldProps.meta.error && <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 && 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 && roomNameErrors.length > 0) {
        errors.roomNames = roomNameErrors;
      }
    }
  }

  return errors;
};
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'.