我正在尝试解析返回用户数组的 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 中仅为错误用户显示错误消息怎么办?显而易见的(天真的?)方法是使所有属性都可以为空,但有更好的方法吗?我还考虑过先返回 a 分两步解析响应,t.array(t.unknown)
但我不确定这会是什么样子