TypeScript 实用函数式编程指南:拒绝学术,直击实战

解决函数式编程(FP)过于学术化、难以落地的痛点,提供一套不含范畴论术语的 80/20 实战方案,通过五个核心模式快速提升 TypeScript 代码的可靠性。

为什么需要这个技能

很多开发者在接触函数式编程时,容易被“单子(Monad)”、“函子(Functor)”等学术词汇劝退。但在实际工程中,函数式编程的核心价值在于:通过类型系统强制处理错误、消除副作用、降低嵌套复杂度。

本技能主张“FP 是工具而非宗教”。如果函数式写法让代码变得难以阅读,那就不要使用它。我们只关注那些能真正解决 null 检查地狱、异常处理混乱和回调嵌套问题的实用模式。

适用场景

  • 在 TypeScript 项目中引入 fp-ts 但不知从何开始时。
  • 需要处理深度嵌套的对象结构,且厌倦了重复编写 if (x !== null)
  • 想要将错误处理从 try-catch 转向更显式的类型化返回(Either 模式)。
  • 面对复杂的数据转换流水线,希望代码阅读顺序与执行顺序一致。

核心工作流

本指南建议优先掌握以下五个核心模式,它们覆盖了 80% 的实战需求:

1. Pipe:线性化操作流

消除深层嵌套的函数调用或临时变量,让数据流向从上到下清晰可见。

import { pipe } from 'fp-ts/function'

const result = pipe(
  input,
  parse,
  validate,
  format
)

2. Option:优雅处理空值

Option 替代 nullundefined,通过链式调用消除防御性判空。

import * as O from 'fp-ts/Option'
import { pipe } from 'fp-ts/function'

const getUserCity = (user: User | null): string =>
  pipe(
    O.fromNullable(user),
    O.flatMap(u => O.fromNullable(u.address)),
    O.flatMap(a => O.fromNullable(a.city)),
    O.getOrElse(() => 'Unknown')
  )

3. Either:将错误显式化

不再通过 throw 抛出异常,而是将错误作为类型的一部分返回(Left 为错误,Right 为正确)。

import * as E from 'fp-ts/Either'

function parseAge(input: string): E.Either<string, number> {
  const age = parseInt(input, 10)
  if (isNaN(age)) return E.left('Invalid age')
  return E.right(age)
}

4. Map:无需拆箱的转换

在不改变容器(如 Option 或 Either)状态的情况下,直接转换其内部值。

5. FlatMap:链接可能失败的操作

当每一步操作都可能失败时,使用 flatMap 将其串联,只要其中一步失败,整个链路立即停止并返回该错误。

下载和安装

下载 fp-pragmatic 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐