semantic-typescript 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/eloyhere"
7
7
  },
8
8
  "description": "A modern type-safe stream processing library inspired by JavaScript Generator, Java Stream, and MySQL Index. Supports lazy evaluation, async streams, statistics, and IO-like operations.",
9
- "version": "0.6.0",
9
+ "version": "0.7.0",
10
10
  "type": "module",
11
11
  "readme": "readme.md",
12
12
  "main": "dist/index.js",
@@ -36,7 +36,8 @@
36
36
  "blob-stream",
37
37
  "websocket-stream",
38
38
  "frontend",
39
- "bigInt"
39
+ "bigInt",
40
+ "semantic"
40
41
  ],
41
42
  "repository": {
42
43
  "type": "git",
package/readme.cn.md CHANGED
@@ -1,214 +1,213 @@
1
- # Semantic-TypeScript:一款范式转换的流处理库
2
-
3
- ## 简介
4
- Semantic-TypeScript 代表了流处理技术的一项重大进步,它综合了 JavaScript GeneratorFunctions、Java Streams 和数据库索引范式中最有效的概念。其基础设计原则的核心是通过复杂的惰性求值和智能索引构建极其高效的数据处理管道。该库提供了一个严格类型安全、函数式纯正的流式操作体验,专门为现代 TypeScript 和 JavaScript 开发而设计。
5
-
6
- 与传统的同步处理架构相比,Semantic-TypeScript 实现了一个统一模型,优雅地处理同步(Iterable)和异步(AsyncIterable)数据源。在流生成过程中,数据的流动和终止由回调机制精确控制,使库能够以超凡的优雅处理:
7
-
8
- - 具有确定性控制的实时数据流(DOM 事件、WebSockets、时间间隔)
9
- - 通过内存高效的惰性管道处理大规模数据集
10
- - 通过流畅、声明式的 API 进行复杂的数据转换
11
-
12
- 该库的创新方法从根本上重新构想了开发者与数据序列交互的方式,在一个单一、内聚的包中同时提供了前所未有的性能特性和开发者体验。
13
-
14
- ## 核心理念:定义与执行的分离
15
- Semantic-TypeScript 的一个关键架构洞见是清晰地分离流的定义和执行:
16
-
17
- - **Semantic<E>**:一个不可变的、惰性的数据转换管道蓝图。它定义了将执行哪些操作(过滤、映射等)
18
- - **Collectable<E>**:一个已实例化的、可执行的流视图。它是从 Semantic 获取的,并提供所有终端操作(收集、遍历等)来执行管道并生成结果
19
-
20
- 这种分离强化了清晰的心智模型,并释放了强大的优化能力,例如选择 UnorderedCollectable 来跳过不必要的排序以实现最大速度。
21
-
22
- ## 为什么选择 Semantic-TypeScript?
23
- 为数据流处理选择合适的库需要在性能、类型安全性和表达能力之间取得平衡。Semantic-TypeScript 的设计旨在所有这些维度上都表现出色。
24
-
25
- ### 1. 适用于所有数据序列的统一、类型安全范式
26
- 它为处理任何数据序列(无论是静态数组、实时事件还是异步块)提供了一致的声明式 API,同时利用 TypeScript 的全部功能确保端到端的类型安全。这消除了一整类运行时错误,并将流操作转变为可预测的、经过编译器验证的活动。
27
-
28
- ### 2. 以智能惰性求值实现的不妥协性能
29
- 该库的核心建立在惰性求值之上。诸如过滤器、映射和扁平映射等操作仅仅是组合一个处理管道;直到调用终端操作时,实际工作才会执行。这结合了短路功能(通过限制、任何匹配或自定义中断回调),允许处理提前停止,从而极大地提高了大型或无限流的处理效率。
30
-
31
- ### 3. `Collector<E, A, R>` 模式的强大之处
32
- 受 Java 启发,收集器模式是灵活性的引擎。它将如何累积流元素的规范与流本身的执行解耦。该库为日常任务提供了一组丰富的内置收集器(toArray、groupBy、summate 等),同时使实现您自己复杂的、可重用的归约逻辑变得非常简单。这比固定的一组终端方法要强大和可组合得多。
33
-
34
- ### 4. 对现代 Web 和异步数据的一流支持
35
- Semantic-TypeScript 专为当代开发而设计。它为现代网络源提供了本机工厂方法:
36
-
37
- - `useFrom(iterable)`, `useRange()` 用于静态数据
38
- - `useInterval()`, `useAnimationFrame()` 用于基于时间的流
39
- - `useBlob()` 用于分块二进制数据处理
40
- - `useWebSocket()`, `useDocument()`, `useWindow()` 用于实时事件流
41
-
42
- ### 5. 超越基本聚合:内置统计分析
43
- 超越简单的求和与平均。该库提供了专用的 NumericStatistics BigIntStatistics 接口,可以直接从您的流中即时访问高级统计指标——方差、标准差、中位数、偏度和峰度。这将复杂的数据分析变成了一行代码。
44
-
45
- ### 6. 为开发者体验而设计
46
- - **流畅、可链式调用的 API**:将复杂的数据管道编写为可读的、顺序链
47
- - **全面的工具套件**:包含必要的守卫(isFunction, isIterable)、实用程序(useCompare, useTraverse)和函数式接口
48
- - **Optional<T> 集成**:安全地建模值的缺失,消除了空指针的担忧
49
- - **性能指南**:清楚地指导何时使用无序集合以获得速度,何时使用有序集合以保持序列
50
-
51
- ## 安装
52
- ```bash
53
- npm install semantic-typescript
54
- ```
55
-
56
- ## 核心概念实践
57
-
58
- ### 1. 创建流 (Semantic)
59
- 可以使用工厂函数从各种源创建流。
60
-
61
- ```typescript
62
- import { useFrom, useInterval, useDocument } from 'semantic-typescript';
63
-
64
- // 从静态数组创建
65
- const staticStream = useFrom([1, 2, 3, 4, 5]);
66
-
67
- // 从异步生成器创建
68
- const asyncStream = useFrom(async function*() {
69
- yield 1;
70
- yield 2;
71
- });
72
-
73
- // 一个基于时间的流
74
- const tickStream = useInterval(1000); // 每秒发射一次
75
-
76
- // 一个 DOM 事件流(参见下面的重要说明)
77
- const clickStream = useDocument('click');
78
- ```
79
-
80
- ### 2. 转换流(中间操作)
81
- 通过链式惰性调用来定义管道。
82
-
83
- ```typescript
84
- const processedStream = staticStream
85
- .filter(x => x % 2 === 0) // 仅保留偶数
86
- .map(x => x * 10) // 乘以 10
87
- .flatMap(x => [x, x + 1]) // 将每个元素转换为两个
88
- .distinct(); // 移除重复项
89
-
90
- // 此时尚未执行任何操作
91
- ```
92
-
93
- ### 3. 执行流(终端操作)
94
- 要获得结果,必须获取一个 Collectable 并调用终端操作。
95
-
96
- ```typescript
97
- // 获取一个无序收集器以提高性能
98
- const resultArray = await processedStream.toUnordered().toArray();
99
- console.log(resultArray); // 例如:[20, 21, 40, 41]
100
-
101
- // 使用内置收集器
102
- const sum = await processedStream.toUnordered().collect(useSummate());
103
- console.log(sum);
104
-
105
- // 或使用通用的 collect 方法
106
- const customResult = await processedStream.toOrdered().collect(
107
- () => new Map<number, number>(),
108
- (map, element, index) => map.set(index, element),
109
- map => map
110
- );
111
- ```
112
-
113
- ### 4. 关键:处理事件流
114
- 事件流(useDocument, useWindow, useHTMLElement, useWebSocket)本质上是无限的。您必须使用诸如 sub、takeWhile 或 limit 等操作来定义何时停止收集事件并完成流。否则,终端操作将无限期等待。
115
-
116
- ```typescript
117
- import { useDocument } from 'semantic-typescript';
118
-
119
- // 仅收集前 5 次点击
120
- const first5Clicks = await useDocument('click')
121
- .limit(5) // <- 关键:将流限制为 5 个事件
122
- .toUnordered()
123
- .toArray();
124
-
125
- // 收集 10 秒窗口内的点击
126
- const clicksIn10s = await useDocument('click')
127
- .takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
128
- .toUnordered()
129
- .toArray();
130
-
131
- // 收集索引 2 到 5 的点击(基于 0)
132
- const specificClicks = await useDocument('click')
133
- .sub(2n, 6n) // <- 获取索引为 2, 3, 4, 5 的元素
134
- .toUnordered()
135
- .toArray();
136
- ```
137
-
138
- **关键见解**:事件(例如 MouseEvent)及其顺序触发索引(作为大整数)通过 `accept(event, index)` 回调一起在管道中传递。
139
-
140
- ### 5. 利用统计功能
141
- ```typescript
142
- const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
143
-
144
- const average = await numericStream.average();
145
- const median = await numericStream.median();
146
- const standardDeviation = await numericStream.standardDeviation();
147
- const skewness = await numericStream.skewness();
148
-
149
- console.log(`Average: ${average}, Median: ${median}, StdDev: ${standardDeviation}`);
150
- ```
151
-
152
- ## 主要特性
153
- - **双流类型**:完全支持同步语义(用于 Iterable)和异步语义(用于 AsyncIterable 和事件)
154
- - **丰富的操作集**:过滤器、映射、扁平映射、连接、去重、排序、限制、跳过、查看、反转、打乱
155
- - **灵活的终端操作**:收集(使用自定义收集器)、toArray、toSet、toMap、forEach、reduce、findFirst、anyMatch、allMatch、count
156
- - **高级收集器**:用于连接、分组、分区、求和、平均、最大值、最小值的内置收集器
157
- - **统计模块**:在数值/大整数流上用于均值、中位数、众数、方差、标准差、范围、分位数、偏度、峰度的即用型方法
158
- - **实用函数**:类型守卫(isPromise, isAsyncIterable)、比较器(useCompare)、遍历(useTraverse)和转换钩子
159
- - **Optional<T>**:一个用于可空值的单子容器,与查找操作集成
160
-
161
- ## API 概述
162
- ### 核心类和接口
163
- - `Semantic<E>` / `AsynchronousSemantic<E>`:抽象的流定义
164
- - `Collectable<E>` / `AsynchronousCollectable<E>`:具有终端操作的可执行流
165
- - `OrderedCollectable<E>` / `UnorderedCollectable<E>`:为顺序敏感或顺序不敏感操作优化的实例化版本
166
- - `Collector<E, A, R>`:可变归约操作的抽象
167
-
168
- ### 工厂函数 (use*)
169
- - **从源创建**:useFrom, useRange, useFill, useEmpty
170
- - **从时间创建**:useInterval, useAnimationFrame
171
- - **从 Web API 创建**:useBlob, useDocument, useWindow, useHTMLElement, useWebSocket
172
- - **收集器**:useToArray, useGroupBy, useSummate, useJoin 等
173
-
174
- ## 性能说明
175
- - **惰性求值**:在调用终端操作之前,管道仅组合而不执行
176
- - **短路求值**:诸如限制、任何匹配和查找首个等操作将在结果确定后立即停止处理元素
177
- - **有序与无序**:
178
- - 当源元素的顺序对您的结果不重要时(例如,求和、最大值或 toSet),对终端操作使用 `.toUnordered()`。这允许内部优化跳过昂贵的排序步骤
179
- - 当顺序很重要时(例如,toArray 必须保留顺序),使用 `.toOrdered()`
180
-
181
- ## 入门示例
182
- ```typescript
183
- import { useFrom, useSummate, useGroupBy } from 'semantic-typescript';
184
-
185
- interface Transaction {
186
- id: number;
187
- amount: number;
188
- category: string;
189
- }
190
-
191
- const transactions: Transaction[] = [
192
- { id: 1, amount: 100, category: 'Food' },
193
- { id: 2, amount: 200, category: 'Electronics' },
194
- { id: 3, amount: 50, category: 'Food' },
195
- { id: 4, amount: 300, category: 'Electronics' },
196
- ];
197
-
198
- // 计算每个类别的总金额
199
- const totalsByCategory = await useFrom(transactions)
200
- .toUnordered()
201
- .collect(
202
- useGroupBy(
203
- t => t.category,
204
- t => t.amount,
205
- useSummate() // 值的收集器
206
- )
207
- );
208
-
209
- console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
210
- ```
211
-
212
- Semantic-TypeScript 是为那些寻求严格设计、类型安全和高性能流处理库的开发者而构建的。它将企业级数据转换模式的力量带入了 TypeScript 生态系统,非常适合数据密集型前端应用程序、Node.js 数据处理,以及任何需要优雅、高效处理序列的场景。
213
-
214
- [![GitHub](./GitHub.png)](https://github.com/eloyhere/semantic-typescript) [![NPM](./NPM.png)](https://www.npmjs.com/package/semantic-typescript)
1
+ # **Semantic-TypeScript**
2
+ **流,索引化。** 您的数据,尽在掌控。
3
+
4
+ ---
5
+
6
+ ### 概述
7
+
8
+ Semantic-TypeScript 是流处理技术的一次重大飞跃,它**集大成**了 JavaScript `GeneratorFunction`、Java Streams 和 MySQL 式索引中最有效的概念。其核心理念既简单又强大:通过智能索引而非暴力迭代,来构建高效的数据处理管道。
9
+
10
+ 当传统库强制使用同步循环或笨拙的 Promise 链时,Semantic-TypeScript 提供了一种**完全异步**、函数式纯粹且类型安全的体验,专为现代前端开发的需求而设计。
11
+
12
+ 在其优雅的模型中,数据仅在上游管道显式调用 `accept`(以及可选的 `interrupt`)回调时才会抵达消费者。您完全掌控时机——就在您需要的时候。
13
+
14
+ ---
15
+
16
+ ### 开发者为何青睐它
17
+
18
+ - **零样板索引** 每个元素都携带其自然或自定义索引。
19
+ - **函数式纯粹风格** — 具备完整的 TypeScript 类型推断。
20
+ - **防泄漏事件流** `useWindow`、`useDocument`、`useHTMLElement` 和 `useWebSocket` 在设计时就考虑了安全性。您通过 `limit(n)`、`sub(start, end)` 或 `takeWhile(predicate)` 定义边界,库则负责清理。没有残留的监听器,没有内存泄漏。
21
+ - **开箱即用的统计** — 全面的数值和 bigint 分析,包括平均值、中位数、众数、方差、偏度和峰度。
22
+ - **可预测的性能** 根据需求在有序和无序收集器之间选择。
23
+ - **内存高效** — 流采用惰性求值,无需担心内存问题。
24
+ - **无未定义行为** — TypeScript 保证类型安全和可空性。除非在回调函数中显式修改,否则输入数据保持不变。
25
+
26
+ ---
27
+
28
+ ### 安装
29
+
30
+ ```bash
31
+ npm install semantic-typescript
32
+ ```
33
+
34
+ ```bash
35
+ yarn add semantic-typescript
36
+ ```
37
+
38
+ ---
39
+
40
+ ### 快速开始
41
+
42
+ ```typescript
43
+ import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
44
+
45
+ // 数值统计
46
+ let summate: number = useOf(10, 20, 30, 40)
47
+ .map((n: number): number => n * 2)
48
+ .toNumericStatistics() // 终结操作前必需
49
+ .summate(); // 200
50
+
51
+ // Bigint 统计
52
+ let summate: bigint = useOf(10n, 20n, 30n, 40n)
53
+ .map((n: bigint): bigint => n * 2)
54
+ .toBigIntStatistics() // 终结操作前必需
55
+ .summate(); // 200n
56
+
57
+ // 通过索引反转流
58
+ useFrom([1, 2, 3, 4, 5])
59
+ .redirect((element: E, index: bigint): bigint => -index) // 负索引以实现反转
60
+ .toOrdered() // 调用 toOrdered() 以保持索引顺序
61
+ .toArray(); // [5, 4, 3, 2, 1]
62
+
63
+ // 打乱流
64
+ useFrom([1, 2, 3, 4, 5])
65
+ .shuffle()
66
+ .toOrdered()
67
+ .toArray(); // 例如:[2, 5, 1, 4, 3]
68
+
69
+ // 在流内平移元素
70
+ useFrom([1, 2, 3, 4, 5])
71
+ .translate(2) // 将元素向右移动 2 位
72
+ .toOrdered()
73
+ .toArray(); // [4, 5, 1, 2, 3]
74
+
75
+ useFrom([1, 2, 3, 4, 5])
76
+ .translate(-2) // 将元素向左移动 2
77
+ .toOrdered()
78
+ .toArray(); // [3, 4, 5, 1, 2]
79
+
80
+ // 无限范围与提前终止
81
+ useRange(0n, 1_000_000n)
82
+ .filter(n => n % 17n === 0n)
83
+ .limit(10n) // 在 10 个元素后停止
84
+ .toUnordered()
85
+ .toArray();
86
+
87
+ // 实时窗口大小调整(5 次事件后自动停止)
88
+ useWindow("resize")
89
+ .limit(5n) // 对事件流至关重要
90
+ .toUnordered()
91
+ .forEach((ev, idx) => console.log(`调整大小 #${idx}`));
92
+
93
+ // 监听 HTML 元素
94
+ // <input id="input" type="text"/>
95
+ useHTMLElement("#input", "change")
96
+ .limit(1)
97
+ .toUnordered()
98
+ .forEach((event: Event) => submit(event));
99
+
100
+ // 监听多个元素和事件
101
+ useHTMLElement("input", ["change", "keyup"])
102
+ .takeWhile((event: Event): boolean => validate(event))
103
+ .toUnordered()
104
+ .forEach((event: Event) => submit(event));
105
+
106
+ // 监听 WebSocket
107
+ let webSocket = new WebSocket("ws://localhost:8080");
108
+ webSocket.addEventListener("close", (): void => {
109
+ webSocket.close(); // 需手动管理 WebSocket 生命周期
110
+ });
111
+ useWebSocket(webSocket, "message")
112
+ .limit(1)
113
+ .toUnordered()
114
+ .forEach((message: MessageEvent) => console.log(message.data));
115
+
116
+ // 按码点迭代字符串
117
+ useText("My emotion now is: 😊, and semantic is 👍")
118
+ .toUnordered()
119
+ .log(); // 输出字符串
120
+
121
+ // 安全地字符串化包含循环引用的对象
122
+ let o = {
123
+ a: 1,
124
+ b: "text",
125
+ c: [o.a, o.b, o.c] // 循环引用
126
+ };
127
+ // let text: string = JSON.stringify(o); // 抛出错误
128
+ let text: string = useStringify(o); // 安全地生成 `{a: 1, b: "text", c: []}`
129
+ ```
130
+
131
+ ---
132
+
133
+ ### 核心概念
134
+
135
+ | 概念 | 目的 | 何时使用 |
136
+ | :--- | :--- | :--- |
137
+ | `AsynchronousSemantic` | 用于异步流、事件和惰性管道的核心构建器。 | 实时事件、WebSocket、DOM 监听器、长时间运行或无限流。 |
138
+ | `SynchronousSemantic` | 用于同步、内存中或基于循环的流的构建器。 | 静态数据、范围、立即迭代。 |
139
+ | `toUnordered()` | 最快的终结收集器(基于 Map 的索引)。 | 性能关键路径(O(n) 时间与空间,无排序)。 |
140
+ | `toOrdered()` | 有序的、索引稳定的收集器。 | 当需要稳定排序或索引访问时。 |
141
+ | `toNumericStatistics()` | 丰富的数值统计分析(均值、中位数、方差、偏度、峰度等)。 | 数据分析和统计计算。 |
142
+ | `toBigIntStatistics()` | 丰富的 bigint 统计分析。 | 针对大整数的数据分析和统计计算。 |
143
+ | `toWindow()` | 滑动和滚动窗口支持。 | 时间序列处理、批处理和窗口化操作。 |
144
+
145
+ ---
146
+
147
+ **重要使用规则**
148
+
149
+ 1. **事件流**(`useWindow`、`useDocument`、`useHTMLElement`、`useWebSocket`……)返回一个 `AsynchronousSemantic`。
150
+ → 您**必须**调用 `.limit(n)`、`.sub(start, end)` 或 `.takeWhile()` 来停止监听。否则,监听器将保持活动状态。
151
+
152
+ 2. **终结操作**(`.toArray()`、`.count()`、`.average()`、`.reduce()`、`.findFirst()` 等)**仅在**转换为收集器**之后**可用:
153
+ ```typescript
154
+ .toUnordered() // O(n) 时间与空间,无排序
155
+ //
156
+ .toOrdered() // 已排序,保持顺序
157
+ ```
158
+
159
+ ---
160
+
161
+ ### 性能特征
162
+
163
+ | 收集器 | 时间复杂度 | 空间复杂度 | 是否排序? | 最佳适用场景 |
164
+ | :--- | :--- | :--- | :--- | :--- |
165
+ | `toUnordered()` | O(n) | O(n) | 否 | 追求原始速度,顺序不重要时。 |
166
+ | `toOrdered()` | O(2n) | O(n) | 是 | 需要稳定排序、索引访问或分析时。 |
167
+ | `toNumericStatistics()` | O(2n) | O(n) | 是 | 需要排序数据的统计操作。 |
168
+ | `toBigIntStatistics()` | O(2n) | O(n) | 是 | 针对 bigint 的统计操作。 |
169
+ | `toWindow()` | O(2n) | O(n) | 是 | 基于时间的窗口化操作。 |
170
+
171
+ 当速度至上时,选择 `toUnordered()`。仅当您需要稳定排序或依赖于排序数据的统计方法时,才使用 `toOrdered()`。
172
+
173
+ ---
174
+
175
+ **与其他前端流处理器的对比**
176
+
177
+ | 特性 | Semantic-TypeScript | RxJS | 原生 Async Iterators / Generators | Most.js |
178
+ | :--- | :--- | :--- | :--- | :--- |
179
+ | **TypeScript 集成** | 一流的深度类型支持,具备原生索引感知。 | 优秀,但涉及复杂的泛型。 | 良好,需要手动类型标注。 | 强大,函数式优先风格。 |
180
+ | **内置统计分析** | 对 `number` 和 `bigint` 的全面原生支持。 | 非原生支持(需要自定义操作符)。 | 无。 | 无。 |
181
+ | **索引与位置感知** | 原生、强大的每个元素 bigint 索引。 | 需要自定义操作符(`scan`、`withLatestFrom`)。 | 需要手动计数器。 | 基础,无内置索引。 |
182
+ | **事件流管理** | 专用的、类型安全的工厂函数,具备显式的提前停止控制。 | 强大但需要手动管理订阅。 | 手动事件监听器 + 取消。 | 良好的 `fromEvent`,轻量。 |
183
+ | **性能与内存效率** | 卓越——优化的 `toUnordered()` `toOrdered()` 收集器。 | 非常好,但操作符链会带来开销。 | 优秀(零开销)。 | 优秀。 |
184
+ | **包体积** | 非常轻量。 | 较大(即使进行 Tree Shaking)。 | 零(原生)。 | 小。 |
185
+ | **API 设计理念** | 函数式收集器模式,具有显式索引。 | 响应式 Observable 模式。 | 迭代器 / 生成器模式。 | 函数式,无点风格。 |
186
+ | **提前终止与控制** | 显式(`interrupt`、`.limit()`、`.takeWhile()`、`.sub()`)。 | 良好(`take`、`takeUntil`、`first`)。 | 手动(在 `for await…of` 中使用 `break`)。 | 良好(`take`、`until`)。 |
187
+ | **同步与异步支持** | 统一的 API——对两者都提供一流支持。 | 主要是异步。 | 两者都支持,但需手动处理。 | 主要是异步。 |
188
+ | **学习曲线** | 对于熟悉函数式和索引管道的开发者来说很平缓。 | 较陡峭(众多操作符、热/冷 Observable)。 | 低。 | 中等。 |
189
+
190
+ **Semantic-TypeScript 的主要优势**
191
+
192
+ * 独特的内置统计和索引功能,无需手动 `reduce` 或外部库。
193
+ * 对事件流的显式控制,防止了 RxJS 中常见的内存泄漏。
194
+ * 统一的同步/异步设计,为多样化的用例提供了单一、一致的 API。
195
+
196
+ 此对比说明了为何 Semantic-TypeScript 特别适合那些需要高性能、类型安全和丰富分析功能,而又不希望陷入传统响应式库繁琐仪式感的现代 TypeScript 前端应用。
197
+
198
+ ---
199
+
200
+ ### 准备探索?
201
+
202
+ Semantic-TypeScript 将复杂的数据流转化为可读、可组合且高性能的管道。无论您是处理实时 UI 事件、处理大型数据集还是构建分析仪表板,它都能提供数据库级索引的强大功能与函数式编程的优雅。
203
+
204
+ **下一步:**
205
+
206
+ * 在您的 IDE 中浏览完整的类型化 API(所有导出均来自主包)。
207
+ * 加入不断壮大的开发者社区,他们已用清晰的 Semantic 管道取代了复杂的异步迭代器。
208
+
209
+ **Semantic-TypeScript** 流与结构的交汇点。
210
+
211
+ 立即开始构建,体验精心设计的索引所带来的不同。
212
+
213
+ **构建清晰,运行自信,让数据流转尽在掌控。**