用途
本技能聚焦于 fp-ts 中的代数数据类型(Algebraic Data Types, ADT)与类型类(Type Classes),帮助开发者在 TypeScript 中构建更健壮、可维护的领域模型。它适用于需要精确表达业务状态、组合数据、以及定义可复用行为的场景。
主要能力
代数数据类型
代数数据类型是由其他类型组合而成的复合类型,分为两类:
- 积类型(Product Types):使用“与”组合类型,如元组(tuple)和记录(record)。例如,一个用户同时拥有姓名和邮箱。
- 和类型(Sum Types):使用“或”组合类型,即可辨识联合(discriminated unions)。例如,一个结果要么是成功,要么是失败。
类型类
类型类定义了一组可针对不同具体类型实现的行为。在 fp-ts 中,它们以接口形式表示,并为特定类型提供实例:
- Eq:相等性比较
- Ord:排序/比较
- Semigroup:合并两个相同类型的值
- Monoid:带有单位元(identity element)的 Semigroup
使用方式
积类型
积类型表示同时包含所有组成部分的值。
元组:固定长度且位置有类型的数组。示例代码展示了如何定义元组类型、访问元素、以及使用 fp-ts 的 Tuple 模块进行映射和双映射操作。
记录(对象类型):TypeScript 中最常见的积类型。示例展示了如何定义领域模型接口(如 User、Order),并强调所有字段必须同时存在。
何时使用积类型:当实体需要所有数据片段才有效、数据自然属于一起、建模数据库实体或 API 负载、组件总是同时出现时。
和类型(可辨识联合)
和类型表示可以是多种变体之一的值。
基本可辨识联合:示例定义了 PaymentMethod 类型,包含 CreditCard、PayPal、BankTransfer、Crypto 等变体,每个变体有唯一的 _tag 字段。
模式匹配:通过 fold/match 函数实现穷尽性模式匹配。示例展示了如何为 PaymentMethod 定义 fold 函数,并根据 _tag 分支处理。
智能构造器:示例展示了 RemoteData 类型(NotAsked、Loading、Failure、Success)的智能构造器和类型守卫,以及如何在 React 中使用 fold 进行渲染。
何时使用和类型:当值可以处于不同状态、不同变体有不同数据形状、需要穷尽处理所有情况、建模状态机或工作流时。
Semigroup
Semigroup 定义如何合并两个相同类型的值,必须满足结合律:combine(combine(a, b), c) === combine(a, combine(b, c))。
基本用法:示例展示了内置 Semigroup(如数字求和、乘积、字符串连接)以及 concatAll 的用法。
自定义实例:示例展示了如何定义取第一个值、取最后一个值、取最大值、取最小值的 Semigroup。
实际示例:合并配置。示例展示了如何为 ServerConfig 定义 Semigroup,使用 last 覆盖、max 取最大值、以及数组合并去重。
可选值的 Semigroup:示例展示了如何为 Option 类型定义 Semigroup,以及合并部分配置。
Monoid
Monoid 是带有单位元(empty)的 Semigroup。单位元满足:concat(empty, a) === a 且 concat(a, empty) === a。
基本用法:示例展示了内置 Monoid(如数字求和、乘积、字符串连接、数组)以及 concatAll 的用法。
自定义实例:示例展示了布尔 AND 和 OR 的 Monoid。
实际示例:合并结果。示例展示了如何为 AggregationResult 定义 Monoid,用于聚合处理结果(总数、成功数、错误数、错误列表、处理时间)。
统计 Monoid:示例展示了如何为 Statistics 定义 Monoid,用于计算计数、总和、最小值、最大值,并进一步计算平均值。
Eq 类型类
Eq 定义类型的相等性比较。
基本用法:示例展示了内置 Eq 实例(数字、字符串)以及数组的 Eq。
自定义实例:示例展示了如何为 User 类型定义 Eq 实例(内容在提供的资料中截断,未完整展示)。
适用场景
- 需要精确建模业务领域中的状态和变体时
- 需要组合和聚合数据(如配置合并、统计计算)时
- 需要定义可复用的相等性、排序、合并行为时
- 使用 TypeScript 进行函数式编程时
限制
- 提供的资料中未提及该技能的安装方式、依赖要求、版本兼容性、收费模式或平台限制。
- 部分代码示例(如 User 的 Eq 实例)在资料中不完整,无法展示完整实现。
- 该技能假设读者已具备 TypeScript 和 fp-ts 的基础知识。