用途
本技能面向在 TypeScript 中使用 fp-ts 进行函数组合的开发者,提供一套实用模式,帮助把复杂逻辑拆解为小而专注的函数,再通过 pipe 与 flow 串联成清晰的数据处理管道。
核心思想
函数组合的核心非常简单:
pipe(data, fn1, fn2, fn3) === fn3(fn2(fn1(data)))
即从左到右依次把上一个函数的输出传给下一个函数,无需范畴论背景。
主要能力
1. pipe()
用管道替代嵌套调用,使代码从“由内向外、从右到左”的阅读方式变为“从上到下、从左到右”的自然顺序。示例:
import { pipe } from 'fp-ts/function'
const result = pipe(
rawInput,
parseData,
validateInput,
calculateTotal,
formatOutput
)
资料中给出处理用户输入的完整示例:定义 trimEmail、trimName、parseAge 等小函数,再用 pipe 组合为 cleanUserInput。
2. 构建可复用工具
通过 flow 把基础函数组合成专用工具,资料给出三类示例:
- 字符串工具:trim、lowercase、uppercase、replace、prefix、suffix,组合出 slugify、titleCase、kebabCase。
- 数字工具:clamp、round、multiply、add,组合出 toPercentage、formatPrice、normalizeScore。
- 数组工具:结合 fp-ts/Array 的 filter、map、reduce、sort,以及 prop、isNotNull、hasLength 等辅助函数,组合出 getInStockProductNames、getTotalValue、getProductsSortedByPrice。
3. Data-Last 参数顺序
资料强调“配置在前、数据在后”的通用规则,使函数便于部分应用并自然用于管道:
const map = <A, B>(fn: (a: A) => B) =>
(arr: A[]): B[] => arr.map(fn)
const doubleAll = map((n: number) => n * 2)
pipe([1, 2, 3], doubleAll) // [2, 4, 6]
还介绍如何把 data-first 的内置 API(如 Date 格式化、JSON 解析、正则匹配)包装为 data-last 形式。
4. 何时适合组合
资料列出适合组合的场景:多步数据转换、构建专用函数、校验链、事件处理器。也列出不适合的场景:单一操作、需要多个不相关输入、复杂分支逻辑、团队不熟悉函数式编程。并给出决策指南表格。
5. 调试管道
提供 trace、traceIf、traceWith、breakpoint、assertType 等调试辅助函数,可在管道中插入日志、断点或类型断言,并建议把长管道拆分为命名阶段以便排查。
实践模式
资料给出五个模式:
- 数据处理管道:RawRecord 经 parseTimestamp、parseValue、isValid、sortByDate 组合为 processRecords。
- 创建专用函数:createFetcher 生成 apiFetch,再派生 fetchUsers、fetchProducts、fetchOrders。
- 组合校验器:基于 fp-ts/Either 的 Validator,用 E.flatMap 串联 nonEmpty、minLength、maxLength、matches,构成 validateUsername、validateEmail。
- 链式 API 转换:基于 fp-ts/TaskEither,用 TE.flatMap、TE.map 组合 fetchUser 与 fetchUserPosts,得到 getUserWithPosts。
- 可配置工具:createFormatter 根据 locale、currency、日期与数字格式配置,生成 currency、date、number、percent 等格式化函数。
使用方式
资料中的示例均以 TypeScript 代码呈现,依赖 fp-ts 的 function、Array、Option、Either、TaskEither 模块。具体安装命令、版本要求与运行环境暂未提供。
适用场景
适合需要在 TypeScript 项目中组织多步数据转换、构建可复用工具函数、编写校验逻辑或组合异步 API 调用的开发者。
限制
资料明确指出:当简单函数更清晰、需要多个输入、调试困难或团队不熟悉函数式编程时,不应强行使用组合。此外,本技能未提供官方文档链接、安装步骤、性能数据或与其他库的对比。