函数组合通过pipe/compose串联纯函数实现逻辑增强,推荐pipe;需加固异步、类型校验、this绑定及错误处理;适用数据转换场景,慎用于副作用操作。

高阶函数实现函数组合式逻辑增强,核心是把多个小而纯的函数“串起来”,让数据按顺序流过,每一步只专注一个职责。关键不在于写得多炫,而在于让逻辑可读、可测、可替换。
用 pipe 或 compose 搭建数据流水线
pipe 从左到右执行,更贴近自然阅读习惯;compose 从右到左,符合数学表达(f ∘ g)。实际项目中推荐统一用 pipe:
-
pipe:适合多数场景,比如处理用户输入:
pipe(trim, toLowerCase, capitalize) -
compose:适合复用已有函数且调用顺序固定时,如
compose(format, filter, fetchUsers) - 两者都要求每个函数必须是单入单出,多参数函数需先柯里化或预设参数
让组合具备现实可用性
原生组合函数容易在真实业务中“掉链子”,需要针对性加固:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 异步函数不能直接塞进普通 pipe —— 要用
pipeAsync,内部用await串行等待 - 防止非函数传入:组合前校验每个参数是否为
typeof fn === 'function' - 避免 this 丢失:类方法参与组合时,用
bind(this)或箭头函数封装 - 错误不可穿透:组合链中某步抛错会中断后续,必要时加
try/catch包装器
用高阶函数封装常见增强行为
不是所有逻辑都适合写成独立函数再组合,有些增强模式可直接做成高阶函数:
- debounce:返回防抖后的新函数,原搜索逻辑不变
- withLoading:包裹异步操作,自动切换 loading 状态
- validate:接收规则数组,返回带校验和提示的函数
- memoize:缓存计算结果,适合开销大、输入稳定的函数
组合不是万能,要识别适用边界
函数组合真正发力的地方是数据转换类逻辑(字符串处理、对象格式化、数组清洗),而非控制流或副作用密集型操作:
- 适合:表单输入清洗、API 响应标准化、日志字段注入
- 慎用:含 DOM 操作、本地存储、全局状态变更的函数
- 警惕过度组合:如果为了组合,要写一堆 curry、wrap、adapt,说明它本就不该被拆
- TypeScript 下类型推导易变弱,泛型函数参与组合时建议显式标注返回类型

















