Formik + 是的,数组被转换为对象然后验证失败

Formik + Yup, array being converted to object and then failing validation

我有一组具有以下 Yup 架构的过滤器:

const schema = Yup.object().shape({
  filters: Yup.array().strict().of(
    Yup.array().strict().of(
      Yup.object().shape({
        // This isn't important
      })
    )
  )
});

当我打开页面时,表单有以下数据(即formik.value的值):

{
  "filters": [
    [
      {
        "type": "samplemeta",
        "cmp": "lt",
        "key": "fastqc__%GC",
        "value": [
          "50"
        ]
      }
    ]
  ],
}

现在由于某种原因,验证失败并出现此错误(即 formik.errors 的值):

{
  "filters": [
    "filters[0] must be a `array` type, but the final value was: `{\n  \"0\": {\n    \"type\": \"\\"samplemeta\\"\",\n    \"cmp\": \"\\"lt\\"\",\n    \"key\": \"\\"fastqc__%GC\\"\",\n    \"value\": [\n      \"\\"50\\"\"\n    ]\n  }\n}`."
  ]
}

因此,尽管实际数据显然有效,但我的形状为 [{}] 的数组正在转换为形状为 {0: {}} 的对象,这将导致 Yup 验证失败。当我使用 <FieldArray> 组件管理过滤器数组时,我看不出这是怎么回事。你可以在源代码中看到这个here,它看起来像:

 <FieldArray name="filters" render={outerArrayHelpers => (...)}/>

为什么会发生这种情况,我该如何避免?

事实证明这是一个已经报告的错误,我已经写了 here. It was originally reported here, and fixed here,但没有包含在 2.1.4 中。我相信 2.1.5 应该有修复,但与此同时,您可以使用 npm install https://pkg.csb.dev/jaredpalmer/formik/commit/157603ab/formik 解决此问题,它会安装 Formik 的开发版本并合并拉取请求。