# @3fv/prelude-ts 中文文档

规范地址：https://npmcn.com/package/%403fv/prelude-ts/

版本：0\.8\.42
npm 元数据更新时间：2026-05-25T18:57:43.283Z
中文译文更新时间：2026-11-06T17:04:46.510Z
软件包许可：ISC

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%403fv/prelude-ts
原文对照：https://npmcn.com/package/%403fv/prelude-ts/?lang=original
项目主页：https://github.com/emmanueltouzery/prelude.ts#readme
源码仓库：https://github.com/3fv/prelude-ts

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：3.4 MB，231 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：3 个
- 首次发布：2019-12-13T23:26:17.072Z
- 最新版本发布：2026-05-25T18:57:43.135Z
- 近 30 天下载量：2652（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：27（近 12 个月 2 个）

## 中文简介

一个打字功能编程库

## 安装

```sh
npm install @3fv/prelude-ts
```

也可以使用：`pnpm add @3fv/prelude-ts`、`yarn add @3fv/prelude-ts`、`bun add @3fv/prelude-ts`

## README

# 预奏

**全体** 学分归原始创造者 `prelude-ts`

这只是一个已出版的版本, 并添加了多个

[![NPM version](https://img.shields.io/npm/v/prelude-ts.svg?style=flat-square)](https://www.npmjs.com/package/prelude-ts) [![Tests](https://circleci.com/gh/emmanueltouzery/prelude-ts.svg?style=shield)](https://circleci.com/gh/emmanueltouzery/prelude-ts) [![apidoc](http://emmanueltouzery.github.io/prelude.ts/apidoc.svg)](http://emmanueltouzery.github.io/prelude.ts/latest/apidoc/globals.html)

## 介绍

前作-t(前作前作-t)是一个TypeScript库,旨在使功能编程 概念在 TypeScript 中可以访问和生产。 注意,尽管它是 以 TypeScript 写成, 它完全可以从 JavaScript (包括 ES5) 中使用 !

它规定 [持久性](https://en.wikipedia.org/wiki/Persistent_data_structure) 不可移动的集合(Vector, Set, Map, Stream),以及诸如Option, 不管是Predicate还是未来.

```typescript
Vector.of(1,2,3)
  .map(x => x*2)
  .head()
// => Option.of(2)

Option.sequence(
  Vector.of(Option.of(1), Option.of(2)))
// => Option.of(Vector.of(1,2))

Vector.of(1,2,3,4).groupBy(x => x%2)
// => HashMap.of([0, Vector.of(2,4)],[1, Vector.of(1,3)])

Vector.of(1,2,3).zip("a", "b", "c").takeWhile(([k,v]) => k<3)
// Vector.of([1,"a"],[2,"b"])

HashMap.of(["a",1],["b",2]).get("a")
// Option.of(1)
```

收集器也是JavaScript traperables, 所以如果你有 ES6 运行时间, 您可以使用 `for .. of` 建在他们身上。 如果你不熟悉的话 不可改变的收藏, `list.append(newItem)` 保留 `list` 不变; `append()` 返回新列表。 不可改变性有助于代码的推理.

你可以检查 **[用户指南](https://github.com/emmanueltouzery/prelude-ts/wiki/Prelude%E2%88%92ts-user-guide)**, (中文(简体) ), 浏览 **[API 文档](http://emmanueltouzery.github.io/prelude.ts/latest/apidoc/globals.html)**, (中文(简体) ), 或者我们 **[博客](http://emmanueltouzery.github.io/blog/tags/prelude.ts.html)**。 。 。 . 注意构造器是私有的,你应该使用静态方法建造 (b) 诸如: `Option.of`, (中文(简体) ), `Vector.of`, (中文(简体) ), `Vector.ofIterable`,等等。 (笑声).

`HashSet` 财务报告和审定财务报表 `HashMap` 使用 [HAMT 算法](http://en.wikipedia.org/wiki/Hash_array_mapped_trie), (中文(简体) ), 具体来说 [hunt plus 库](https://www.npmjs.com/package/hamt_plus)。 。 。 . `Vector` 通过一个 [被比特映射的矢量 trie](http://hypirion.com/musings/understanding-persistent-vector-pt-1) 具体来说 [列表库](https://github.com/funkia/list/)页:1. 此外,库以平庸的JavaScript风格写出,并有回环 而不是重复,所以表现应该很好 (单位:千美元)[参见此处基准与不可改变的.js 及更多](https://github.com/emmanueltouzery/prelude-ts/wiki/Benchmarks)) (中文(简体) ). `list` 财务报告和审定财务报表 `hamt_plus` 是前奏的两个唯一依存.

## 设置、地图和平等

JavaScript除原始类型外没有结构上的平等. 这么说吧 `1 === 1` 是真的,不过 `[1] === [1]` 没有, 也不是 `{a:1} === {a:1}`。 。 。 . 这给收藏带来了问题,因为如果你有 `Set`你没有 由于平等的定义有限,想要重复要素.

因此,序曲鼓励您定义非原始类型 方法 `equals(other: any): boolean` 财务报告和审定财务报表 `hashCode(): number` (中文(简体) ) 方法 [不可移动.js 使用](https://immutable-js.github.io/immutable-js/docs/#/ValueObject)) (中文(简体) ). 通过这些方法,结构上的平等是可以实现的,而且事实上 `Vector.of(1,2,3).equals(Vector.of(1,2,3))` 实值 `true`然而,这只能是 工作,如果您在收藏中的值本身有正确定义的平等 (单位:千美元)[看前奏可以帮助什么](https://github.com/emmanueltouzery/prelude-ts/wiki/Equality)) (中文(简体) ). 如果这些价值观没有结构上的平等,那么我们就不会比 `===` 行为.

前奏试图协助程序员; 它试图鼓励 开发者做正确的事情。 它会拒绝类型 没有明显的正确 在 Sets 和 Maps 密钥中定义平等, 因此 `HashSet.of([1])`, (中文(简体) ), 或者说 `Vector.of([1]).equals(Vector.of([2]))` 将不编译. 对于这两个,你得到(一个更长的版本)这个消息:

```
Type 'number[]' is not assignable to type 'HasEquals'.
  Property 'equals' is missing in type 'number[]'.
```

见 [用户指南](https://github.com/emmanueltouzery/prelude-ts/wiki/Prelude%E2%88%92ts-user-guide#equality) 更多细节.

## 安装

类型脚本必须知道 `Iterable`,一个 ES6 特性(但在大多数浏览器中存在) 来编译序曲。 如果您使用 TypeScript 和目标 ES5, 请最小修改您的 tsconfig.json 可添加:

```json
"lib": ["DOM", "ES5", "ScriptHost", "es2015.iterable"]
```

(与默认的ES5设置相比,它只添加了"es2015. iteable")

### 用于节点.js

只要在您身上加上依赖 `package.json` 开始使用( 如 `import { Vector } from "prelude-ts";`,或 `const { Vector } = require("prelude-ts");` 如果你使用普通话的话. 一切都应该奏效,包括如果使用 TypeScript 进行类型检查。 前奏还提供了 在节点REPL中相当的打印.

### 使用浏览器

在您中添加依赖性 `package.json`; 类型脚本应自动 注册类型定义.

Npm 包包含文件 `dist/src/prelude_ts.js` 财务报告和审定财务报表 `dist/src/prelude_ts.min.js`, (中文(简体) ), 它们是UMD捆绑;它们与其他模块系统一起工作并设定 `prelude_ts` 如果没有模块系统,则作为窗口全局。 将相关内容包含在您的 脚本标签中的 index.html :

```html
<script src="node_modules/prelude-ts/dist/src/prelude_ts.min.js"></script>
```

您不应该有问题 导入您的应用程序的序曲, 但如果您使用 模块会变得更加复杂 使用它们的一个解决方案是创建 a 一个 `imports.d.ts` 包含以下内容的文件 :

```typescript
// https://github.com/Microsoft/TypeScript/issues/3180#issuecomment-283007750
import * as _P from 'prelude-ts';
export as namespace prelude_ts;
export = _P;
```

然后在一个 `.ts` 在模块之外,您可以做到:

```typescript
import Vector = prelude_ts.Vector;
```

\- 获取没有命名空间的值.

最后,如果您也包括 `dist/src/chrome_dev_tools_formatters.js` 结束 (单位:千美元) `script` 标签,以及 [启用自定义格式化](http://bit.ly/object-formatters), (中文(简体) ), 这样你就可以得到 [在 Chrome 调试器中很好的显示序曲值](https://raw.githubusercontent.com/wiki/emmanueltouzery/prelude-ts/chrome_formatters.png)。 。 。 .

## 愿望清单/即将具备的特点

-   CharSeq,一个字符串包装?
-   非空向量吗 ? (已经 [非空链接列表](http://emmanueltouzery.github.io/prelude.ts/latest/apidoc/classes/linkedlist.conslinkedlist.html)(中文(简体) )
-   使用蹦床或类似技术 `Stream` 避免堆栈溢出非常大溪流上的例外
-   现有类别上更多的功能

## 超出序曲范围

-   免费的僧侣
-   蒙德变压器
-   效果跟踪
-   高级类型模拟

我认为这些概念在语言上无法用足够好的方式表达 例如 TypeScript.

## 替代品和影响

-   [货币.js](https://monet.github.io/monet.js/) - 只有一个 `List` 财务报告和审定财务报表 `Option` 收藏,以功能式ES5执行. 执行情况, 使用再现,表示其列表类型明显比序曲的慢.
-   [不可改变.js](https://immutable-js.github.io/immutable-js/) - 没有 `Option` 概念; 类型可以是 clunky.
-   [庇护](https://github.com/sanctuary-js/sanctuary) 提供全球功能,例如 `S.filter(S.where(...))` 而序曲则倾向于 流利的 API 风格 `list.filter(..).sortBy(...)`而且,避难所不会 提供套装和地图。 另一方面,避难所有一些JS运行时间类型系统 支持,前奏没有.
-   [拉达克](http://ramdajs.com/) 提供全球功能,例如 `R.filter(R.where(...))` 而序曲则倾向于 流利的 API 风格 `list.filter(..).sortBy(...)`而且,拉姆达不提供 集和地图。 拉姆达也用咖哩从盒子里取出很多东西 可能不会 对一些开发者来说是直观的。 在序曲中, [咖喱声](http://emmanueltouzery.github.io/prelude.ts/latest/apidoc/interfaces/function.function2.html#curried) 打开 [部分适用](http://emmanueltouzery.github.io/prelude.ts/latest/apidoc/interfaces/function.function2.html#apply1) 选择进入.
-   [摇篮](https://lodash.com/) 也具有全球功能和许多功能 变异所集.
-   [虚拟](http://www.vavr.io/) - 这是一个爪哇文库,但它是序曲的主要灵感. 请注意Vavr是受斯卡拉图书馆的启发,所以序曲也是, 过渡性.

## 类型脚本版本

截至0.8.2,前奏需要TypeScript 3.1或更新.

## 图标

```
npm install

npm test

npm run-script docgen

npm run benchmarks
```

## 常见问题

### @3fv/prelude-ts 是什么？

一个打字功能编程库

### 如何安装 @3fv/prelude-ts？

在项目目录运行 npm install @3fv/prelude-ts，或使用 pnpm add / yarn add / bun add。

### @3fv/prelude-ts 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @3fv/prelude-ts 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @3fv/prelude-ts 可以商用吗？

@3fv/prelude-ts 使用 ISC 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @3fv/prelude-ts 的下载量有多少？

根据 npm 官方下载统计，@3fv/prelude-ts 在 2026/10/05 – 2026/11/03 这 30 天内被下载 2,652 次，日均约 88 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @3fv/prelude-ts 还在维护吗？

最新版本 0\.8\.42 发布于 2026/05/26（5 个月前）；至今共发布 27 个版本，其中过去 12 个月发布了 2 个；首次发布于 2019/12/14。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

