iots解析Eithers/Validations数组



我试图解析一个返回用户数组的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中只为错误用户显示错误消息,该怎么办?显而易见的(天真的?(方法是使所有属性都可以为null,但有更好的方法吗?我还考虑过分两步解析响应,首先返回一个t.array(t.unknown),但我不确定这看起来像

您可以:

import * as t from "io-ts";
import * as F from 'fp-ts/function'
import * as E from 'fp-ts/Either'
import * as A from 'fp-ts/Array'
const users: unknown[] = [{
name: 'badUser',
email: null,
preferredName: 'hey'
}, {
name: 'goodUser',
email: 'ihaveemail@mail.com',
preferredName: 'okay'
}]
const result = F.pipe(
users,
A.map(userV.decode),
A.separate
)

A.separate是一个接受Array<Either<A, B>>并返回对象的函数,其中所有Lefts都在left字段中,Rights在right字段中。

相关内容

  • 没有找到相关文章

最新更新