@dotcom-tool-kit/validated
错误为一等值的类型和函数
理由
在 Tool Kit 中,我们处理装入许多不同类型入口的插件(用于 Tasks, (中文(简体) ), Hook(S等)并行进行。 这一过程可能会出错的各种点有:导入一个入门点,检查版本相容性,等等.
如果我们天真地使用例外抛出或承诺拒绝,工具箱会停止处理所发生的第一个问题;用户会固定它只会碰到下一个错误,这将令人沮丧. 我们想尽我们所能 收集所有错误 一次越迟越好.
我们 能够 继续为此使用例外/拒绝,以及 Promise.allSettled然而,如果采用这种模式,将难以跟踪错误的数据流,很容易不小心忘记整理出一些错误,从而陷入一次扔出一个错误的同一问题.
相反,我们用明确的返回值模拟这些错误, Validated<T>。这种类型的联盟包括: Valid<T> 代表正确价值,以及 Invalid 这代表着一个清单的问题: string 说明理由。 通过使这个类型变得明确,我们清楚地标记了所有能够返回我们可能想要整理的错误的函数,并且使得不决定如何处理错误就无法使用这些值.
这个模式仿照了Go的 使用多个返回值处理错误鲁斯的 Result<T, E> 类型 哈斯凯尔的 Either a b 类型。 。 。 .
使用量
创建一个 Validated
@dotcom-tool-kit/validated 导出两个构造函数, valid 财务报告和审定财务报表 invalid。当值的状态已知时,使用这些来创建折叠器,例如:
valid({ some: 'object' })
invalid([
'list of problems'
])
使用 Validated 数值
Validated 对象有类似矩阵或承诺方法的方法,允许您用数值或出错的理由行事,而无需检查类型:
validated.map(value => {
/* do something with value */
// `return` something else. replaces the value with this return value if valid, does nothing if invalid
})
validated.mapError(reasons => {
/* do something with reasons */
// `return` something else. replaces the reasons with this return value if invalid, does nothing if valid
})
从 a 提取值 Validated
Validated 有一个 .unwrap 方法,如果其值是有效的,则允许提取其值,如果无效,则可以抛出错误。 这个应该尽可能地被后期使用,当没有数值就无法再进一步时,如果无效则需要停止.
validated.unwrap('something was invalid!')
组合数组 Validated
类似 Promise.all,如果您有多个 Validateds,您需要分组他们的价值观和理由(即您有 Array<Validated<T>> 而你却想要 Validated<Array<T>>),我们有 reduceValidated数字 :
reduceValidated([
validated1,
validated2,
validated3
])
这在工具箱中被使用, 例如, 我们同时装入多个插件 .