You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:24:26