如何用fp-ts风格合并NonEmptyArray<ValidationError>中的错误?
问题
我定义了如下类:
class ValidationError { constructor( public readonly errors: NonEmptyArray<string>, ) {} }
现在我拥有一个NonEmptyArray<ValidationError>,希望将其转换为一个包含所有错误信息的单个ValidationError。
常规实现方式如下:
const allErrors = validationErrorArr.flatMap(e => e.errors) const newValidationError = new ValidationError(allErrors)
请问用fp-ts的函数式编程风格,最优实现方式是什么?
fp-ts风格的最优实现
借助fp-ts的NonEmptyArray工具链和管道(pipe)模式,可以写出更贴合函数式风格的纯函数实现:
import { NonEmptyArray, pipe } from 'fp-ts/NonEmptyArray'; const mergeValidationErrors = (input: NonEmptyArray<ValidationError>): ValidationError => pipe( input, NonEmptyArray.map(err => err.errors), NonEmptyArray.concatAll, ValidationError );
关键说明:
- 管道串联:通过
pipe将操作链式串联,消除冗余的中间变量,让逻辑流程更直观。 - 类型安全保障:
NonEmptyArray.concatAll专门用于合并嵌套的非空数组,确保最终输出的错误数组依然是NonEmptyArray<string>,完全匹配ValidationError构造函数的参数类型,无需额外处理空数组的边界情况。 - 纯函数特性:整个函数无副作用,输入与输出一一对应,符合函数式编程的核心设计原则。
这种实现既保留了类型安全性,又让代码更简洁、声明式,完全契合fp-ts的编程范式。
内容的提问来源于stack exchange,提问作者Rodrigo C. A.
相关产品推荐
相关产品推荐

