Prelude-TS 使用教程
项目介绍
Prelude-TS 是一个 TypeScript 库,旨在使函数式编程概念在 TypeScript 中易于访问和高效。尽管它用 TypeScript 编写,但也可以完美地从 JavaScript(包括 ES5)中使用。它提供了持久不可变集合(如 Vector、Set、Map、Stream)和构造(如 Option、Either、Predicate 和 Future)。
项目快速启动
安装
首先,通过 npm 安装 Prelude-TS:
npm install prelude-ts
基本使用
以下是一个简单的示例,展示如何使用 Prelude-TS 的 Vector 和 Option:
import { Vector } from 'prelude-ts';
const vec = Vector.of(1, 2, 3);
const doubled = vec.map(x => x * 2);
const head = doubled.head(); // 返回 Option 类型
console.log(head.getOrElse(0)); // 输出: 2
应用案例和最佳实践
使用 Option 处理可能为空的值
import { Option } from 'prelude-ts';
const maybeValue: Option<number> = Option.of(someNullableValue);
const result = maybeValue.map(x => x * 2).getOrElse(0);
使用 Either 处理错误
import { Either } from 'prelude-ts';
const parseNumber = (input: string): Either<string, number> => {
const num = parseInt(input, 10);
return isNaN(num) ? Either.left("Not a number") : Either.right(num);
};
const result = parseNumber("42").map(x => x * 2);
result.match({
Left: err => console.error(err),
Right: val => console.log(val) // 输出: 84
});
典型生态项目
Prelude-IO
Prelude-IO 是一个基于 Prelude-TS 的库,提供 IO 功能(包括反序列化和验证),强调类型安全和不可变性。
Monet.js
Monet.js 是另一个函数式编程库,提供了 List 和 Option 集合,但实现方式使用递归,导致其 List 类型比 Prelude-TS 的慢。
Immutable.js
Immutable.js 是另一个提供不可变集合的库,但它没有 Option 概念,类型可能比较复杂。
Sanctuary
Sanctuary 提供了全局函数,如 S.filter(S.where())
,而 Prelude-TS 更倾向于流畅的 API 风格,如 list.filter().sortBy()
。Sanctuary 还提供了一些 JS 运行时类型系统支持,而 Prelude-TS 没有。
Ramda.js
Ramda.js 提供了全局函数,如 R.filter(R.where())
,并且大量使用柯里化,可能对一些开发者不太直观。Prelude-TS 中柯里化和部分应用是可选的。
Lodash
Lodash 也提供了全局函数,并且许多函数会修改集合。Prelude-TS 强调不可变性,避免直接修改数据。
Vavr
Vavr 是一个 Java 库,是 Prelude-TS 的主要灵感来源。尽管它是 Java 库,但其概念和设计对 Prelude-TS 有很大影响。