【发布时间】:2021-09-18 22:30:30
【问题描述】:
我正在尝试解析返回用户数组的 API 响应。我发现即使数组中的一个元素验证失败,整个编解码器也会返回错误。我希望错误留在数组中,这样我就可以拥有类似Array<Either<E, User>> 的东西。我的 API 的响应看起来像这样
{
"success": true,
"result": [
{
"name": "Jo Smith",
"email": "jo@jo.jo",
"preferredName": null
},
{
"name": "Robert",
"email": "rob@rob.rob",
"preferredName": "Rob"
}
]
}
或
{
"success": false,
"error": "Something went wrong"
}
这是我的编解码器
import * as t from "io-ts";
const userV = t.type({
name: t.string,
email: t.string,
preferredName: t.union([t.string, null]),
});
const successV = t.type({
success: t.literal(true),
result: t.array(userV),
});
const errorV = t.type({
success: t.literal(false),
error: t.string,
});
const responseV = t.union([successV, errorV]);
现在,如果由于某种原因,我们收到一个电子邮件为 null 的用户,则整个响应都会失败。如果我想列出正确解析的用户并在我的 UI 中仅为错误用户显示错误消息怎么办?显而易见的(天真的?)方法是使所有属性都可以为空,但有更好的方法吗?我还考虑通过首先返回 t.array(t.unknown) 分两步解析响应,但我不确定这会是什么样子
【问题讨论】:
-
您是否尝试在您的
userV对象中使用option?{email: option(t.string)} -
option来自哪里?另外,我确实希望该对象的验证失败,但不是整个responseV失败 -
只写:google 中的 io-ts 选项
-
来自 io-ts-types,明白了。虽然对我没有帮助。如果字段错误,我确实希望验证失败(在我的现实生活中,我有更多可能失败的字段)。我需要的是让单个
User对象失败,留下其他适当的对象。所以我认为我需要result成为一个 Eithers 数组,而不是一个充满选项的对象数组 -
我希望能帮助你更多,但我不是 io-ts 方面的专家
标签: typescript validation parsing fp-ts