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/dist/asynchronous/collector.d.ts +62 -58
- package/dist/asynchronous/collector.js +16 -5
- package/dist/asynchronous/semantic.d.ts +2 -2
- package/dist/asynchronous/semantic.js +16 -6
- package/dist/factory.d.ts +8 -0
- package/dist/factory.js +112 -36
- package/dist/hook.d.ts +6 -1
- package/dist/hook.js +20 -3
- package/dist/main.d.ts +1 -0
- package/dist/main.js +6 -0
- package/dist/synchronous/collector.d.ts +8 -4
- package/dist/synchronous/collector.js +74 -59
- package/dist/synchronous/semantic.d.ts +27 -23
- package/dist/synchronous/semantic.js +215 -286
- package/package.json +3 -2
- package/readme.cn.md +213 -214
- package/readme.de.md +172 -173
- package/readme.es.md +177 -172
- package/readme.fr.md +181 -172
- package/readme.jp.md +187 -169
- package/readme.kr.md +182 -169
- package/readme.md +213 -214
- package/readme.ru.md +188 -169
- package/readme.tw.md +178 -169
package/readme.tw.md
CHANGED
|
@@ -1,214 +1,223 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# Semantic-TypeScript
|
|
2
|
+
Flow, Indexed. Ваши данные — под точным контролем.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
Semantic-TypeScript 代表了串流處理技術的一項重大進步,它綜合了 JavaScript GeneratorFunctions、Java Streams 和資料庫索引範式中最有效的概念。其基礎設計原則的核心是透過複雜的惰性求值和智慧索引建構極其高效的資料處理管道。該函式庫提供了一個嚴格型別安全、函數式純正的串流式操作體驗,專門為現代 TypeScript 和 JavaScript 開發而設計。
|
|
4
|
+
---
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
### Обзор
|
|
7
7
|
|
|
8
|
-
-
|
|
9
|
-
- 透過記憶體高效的惰性管道處理大規模資料集
|
|
10
|
-
- 透過流暢、宣告式的 API 進行複雜的資料轉換
|
|
8
|
+
Semantic-TypeScript знаменует собой значительный скачок в технологии потоковой обработки данных, синтезируя наиболее эффективные концепции из JavaScript `GeneratorFunction`, Java Streams и MySQL-стиля индексирования. Его основная философия одновременно проста и мощна: создавать исключительно эффективные конвейеры обработки данных с помощью интеллектуального индексирования, а не грубого перебора.
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
В то время как обычные библиотеки навязывают синхронные циклы или громоздкие цепочки промисов, Semantic-TypeScript обеспечивает полностью асинхронный, функционально чистый и строго типобезопасный опыт, созданный для требований современной фронтенд-разработки.
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
Semantic-TypeScript 的一個關鍵架構洞見是清晰地分離串流的定義和執行:
|
|
12
|
+
В этой элегантной модели данные доходят до потребителя только тогда, когда вышестоящий конвейер явно вызывает колбэки `accept` (и опционально `interrupt`). Вы полностью контролируете время — именно тогда, когда это необходимо.
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
- **Collectable<E>**:一個已實例化的、可執行的串流視圖。它是從 Semantic 獲取的,並提供所有終端操作(收集、遍歷等)來執行管道並產生結果
|
|
14
|
+
---
|
|
19
15
|
|
|
20
|
-
|
|
16
|
+
### Почему разработчики выбирают его
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
為資料串流處理選擇合適的函式庫需要在效能、型別安全性和表達能力之間取得平衡。Semantic-TypeScript 的設計旨在所有這些維度上都表現出色。
|
|
18
|
+
• Индексирование без шаблонного кода — каждый элемент несёт свой естественный или специально заданный индекс.
|
|
24
19
|
|
|
25
|
-
|
|
26
|
-
它為處理任何資料序列(無論是靜態陣列、即時事件還是非同步區塊)提供了一致的宣告式 API,同時利用 TypeScript 的全部功能確保端到端的型別安全。這消除了一整類執行時錯誤,並將串流操作轉變為可預測的、經過編譯器驗證的活動。
|
|
20
|
+
• Чистый функциональный стиль — с полным выводом типов TypeScript.
|
|
27
21
|
|
|
28
|
-
|
|
29
|
-
該函式庫的核心建立在惰性求值之上。諸如過濾器、映射和扁平映射等操作僅僅是組合一個處理管道;直到呼叫終端操作時,實際工作才會執行。這結合了短路功能(透過限制、任何匹配或自訂中斷回呼),允許處理提前停止,從而極大地提高了大型或無限串流的處理效率。
|
|
22
|
+
• Защищённые от утечек потоковые события — `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учётом безопасности. Вы определяете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
|
|
30
23
|
|
|
31
|
-
|
|
32
|
-
受 Java 啟發,收集器模式是靈活性的引擎。它將如何累積串流元素的規範與串流本身的執行解耦。該函式庫為日常任務提供了一組豐富的內建收集器(toArray、groupBy、summate 等),同時使實現您自己複雜的、可重用的歸約邏輯變得非常簡單。這比固定的一組終端方法要強大和可組合得多。
|
|
24
|
+
• Встроенная статистика — всесторонний анализ для чисел (`number`) и больших целых (`bigint`), включая средние значения, медианы, моду, дисперсию, асимметрию и эксцесс.
|
|
33
25
|
|
|
34
|
-
|
|
35
|
-
Semantic-TypeScript 專為當代開發而設計。它為現代網路來源提供了原生工廠方法:
|
|
26
|
+
• Предсказуемая производительность — выбирайте между упорядоченными (`ordered`) и неупорядоченными (`unordered`) коллекторами в зависимости от ваших требований.
|
|
36
27
|
|
|
37
|
-
|
|
38
|
-
- `useInterval()`, `useAnimationFrame()` 用於基於時間的串流
|
|
39
|
-
- `useBlob()` 用於分塊二進位資料處理
|
|
40
|
-
- `useWebSocket()`, `useDocument()`, `useWindow()` 用於即時事件流
|
|
28
|
+
• Эффективное использование памяти — потоки вычисляются лениво, что снимает проблемы с памятью.
|
|
41
29
|
|
|
42
|
-
|
|
43
|
-
超越簡單的求和與平均。該函式庫提供了專用的 NumericStatistics 和 BigIntStatistics 介面,可以直接從您的串流中即時存取進階統計指標——變異數、標準差、中位數、偏度和峰度。這將複雜的資料分析變成了一行程式碼。
|
|
30
|
+
• Никакого неопределённого поведения — TypeScript гарантирует типобезопасность и обработку null/undefined. Входные данные остаются неизменными, если вы явно не изменяете их в своих функциях обратного вызова.
|
|
44
31
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- **Optional<T> 整合**:安全地建模值的缺失,消除了空指標的擔憂
|
|
49
|
-
- **效能指南**:清楚地指導何時使用無序集合以獲得速度,何時使用有序集合以保持序列
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
### Установка
|
|
50
35
|
|
|
51
|
-
## 安裝
|
|
52
36
|
```bash
|
|
53
37
|
npm install semantic-typescript
|
|
54
38
|
```
|
|
39
|
+
или
|
|
40
|
+
```bash
|
|
41
|
+
yarn add semantic-typescript
|
|
42
|
+
```
|
|
55
43
|
|
|
56
|
-
|
|
44
|
+
---
|
|
57
45
|
|
|
58
|
-
###
|
|
59
|
-
可以使用工廠函數從各種來源建立串流。
|
|
46
|
+
### Быстрый старт
|
|
60
47
|
|
|
61
48
|
```typescript
|
|
62
|
-
import { useFrom,
|
|
49
|
+
import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
|
|
50
|
+
|
|
51
|
+
// Статистика для чисел
|
|
52
|
+
let summate: number = useOf(10, 20, 30, 40)
|
|
53
|
+
.map((n: number): number => n * 2)
|
|
54
|
+
.toNumericStatistics() // Обязательно перед терминальной операцией
|
|
55
|
+
.summate(); // 200
|
|
56
|
+
|
|
57
|
+
// Статистика для больших целых
|
|
58
|
+
let summate: bigint = useOf(10n, 20n, 30n, 40n)
|
|
59
|
+
.map((n: bigint): bigint => n * 2)
|
|
60
|
+
.toBigIntStatistics() // Обязательно перед терминальной операцией
|
|
61
|
+
.summate(); // 200n
|
|
62
|
+
|
|
63
|
+
// Развернуть поток по индексу
|
|
64
|
+
useFrom([1, 2, 3, 4, 5])
|
|
65
|
+
.redirect((element: E, index: bigint): bigint => -index) // Отрицательный индекс для разворота
|
|
66
|
+
.toOrdered() // Вызов toOrdered() для сохранения порядка индексов
|
|
67
|
+
.toArray(); // [5, 4, 3, 2, 1]
|
|
68
|
+
|
|
69
|
+
// Перемешать поток
|
|
70
|
+
useFrom([1, 2, 3, 4, 5])
|
|
71
|
+
.shuffle()
|
|
72
|
+
.toOrdered()
|
|
73
|
+
.toArray(); // например, [2, 5, 1, 4, 3]
|
|
74
|
+
|
|
75
|
+
// Сдвиг элементов в потоке
|
|
76
|
+
useFrom([1, 2, 3, 4, 5])
|
|
77
|
+
.translate(2) // Сдвиг элементов вправо на 2 позиции
|
|
78
|
+
.toOrdered()
|
|
79
|
+
.toArray(); // [4, 5, 1, 2, 3]
|
|
80
|
+
|
|
81
|
+
useFrom([1, 2, 3, 4, 5])
|
|
82
|
+
.translate(-2) // Сдвиг элементов влево на 2 позиции
|
|
83
|
+
.toOrdered()
|
|
84
|
+
.toArray(); // [3, 4, 5, 1, 2]
|
|
85
|
+
|
|
86
|
+
// Бесконечный диапазон с ранним завершением
|
|
87
|
+
useRange(0n, 1_000_000n)
|
|
88
|
+
.filter(n => n % 17n === 0n)
|
|
89
|
+
.limit(10n) // Остановиться после 10 элементов
|
|
90
|
+
.toUnordered()
|
|
91
|
+
.toArray();
|
|
63
92
|
|
|
64
|
-
//
|
|
65
|
-
|
|
93
|
+
// События изменения размера окна в реальном времени (автоматически останавливается после 5 событий)
|
|
94
|
+
useWindow("resize")
|
|
95
|
+
.limit(5n) // Критически важно для потоков событий
|
|
96
|
+
.toUnordered()
|
|
97
|
+
.forEach((ev, idx) => console.log(`Изменение размера #${idx}`));
|
|
66
98
|
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
99
|
+
// Прослушивание HTML-элемента
|
|
100
|
+
// <input id="input" type="text"/>
|
|
101
|
+
useHTMLElement("#input", "change")
|
|
102
|
+
.limit(1)
|
|
103
|
+
.toUnordered()
|
|
104
|
+
.forEach((event: Event) => submit(event));
|
|
72
105
|
|
|
73
|
-
//
|
|
74
|
-
|
|
106
|
+
// Прослушивание нескольких элементов и событий
|
|
107
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
108
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
109
|
+
.toUnordered()
|
|
110
|
+
.forEach((event: Event) => submit(event));
|
|
75
111
|
|
|
76
|
-
//
|
|
77
|
-
|
|
112
|
+
// Прослушивание WebSocket
|
|
113
|
+
let webSocket = new WebSocket("ws://localhost:8080");
|
|
114
|
+
webSocket.addEventListener("close", (): void => {
|
|
115
|
+
webSocket.close(); // Управляйте жизненным циклом WebSocket вручную
|
|
116
|
+
});
|
|
117
|
+
useWebSocket(webSocket, "message")
|
|
118
|
+
.limit(1)
|
|
119
|
+
.toUnordered()
|
|
120
|
+
.forEach((message: MessageEvent) => console.log(message.data));
|
|
121
|
+
|
|
122
|
+
// Итерация по строке по кодовым точкам
|
|
123
|
+
useText("My emotion now is: 😊, and semantic is 👍")
|
|
124
|
+
.toUnordered()
|
|
125
|
+
.log(); // Выводит строку
|
|
126
|
+
|
|
127
|
+
// Безопасная сериализация объекта с циклическими ссылками
|
|
128
|
+
let o = {
|
|
129
|
+
a: 1,
|
|
130
|
+
b: "text",
|
|
131
|
+
c: [o.a, o.b, o.c] // Циклическая ссылка
|
|
132
|
+
};
|
|
133
|
+
// let text: string = JSON.stringify(o); // Выбросит ошибку
|
|
134
|
+
let text: string = useStringify(o); // Безопасно возвращает `{a: 1, b: "text", c: []}`
|
|
78
135
|
```
|
|
79
136
|
|
|
80
|
-
|
|
81
|
-
透過鏈式惰性呼叫來定義管道。
|
|
137
|
+
---
|
|
82
138
|
|
|
83
|
-
|
|
84
|
-
const processedStream = staticStream
|
|
85
|
-
.filter(x => x % 2 === 0) // 僅保留偶數
|
|
86
|
-
.map(x => x * 10) // 乘以 10
|
|
87
|
-
.flatMap(x => [x, x + 1]) // 將每個元素轉換為兩個
|
|
88
|
-
.distinct(); // 移除重複項
|
|
139
|
+
### Основные концепции
|
|
89
140
|
|
|
90
|
-
|
|
91
|
-
|
|
141
|
+
| Концепция | Назначение | Когда использовать |
|
|
142
|
+
| :--- | :--- | :--- |
|
|
143
|
+
| `AsynchronousSemantic` | Основной строитель для асинхронных потоков, событий и ленивых конвейеров. | События в реальном времени, WebSocket, слушатели DOM, долгие или бесконечные потоки. |
|
|
144
|
+
| `SynchronousSemantic` | Строитель для синхронных, хранящихся в памяти или основанных на циклах потоков. | Статические данные, диапазоны, немедленная итерация. |
|
|
145
|
+
| `toUnordered()` | Самый быстрый терминальный коллектор (индексирование на основе Map). | Критичные к производительности сценарии (O(n) время и память, без сортировки). |
|
|
146
|
+
| `toOrdered()` | Упорядоченный, стабильный по индексам коллектор. | Когда требуется стабильный порядок или доступ по индексу. |
|
|
147
|
+
| `toNumericStatistics()` | Богатый числовой статистический анализ (среднее, медиана, дисперсия, асимметрия, эксцесс и т.д.). | Аналитика данных и статистические вычисления. |
|
|
148
|
+
| `toBigIntStatistics()` | Богатый статистический анализ для больших целых (`bigint`). | Аналитика данных и статистические вычисления для больших целых чисел. |
|
|
149
|
+
| `toWindow()` | Поддержка скользящих и фиксированных окон. | Обработка временных рядов, пакетная обработка и оконные операции. |
|
|
92
150
|
|
|
93
|
-
|
|
94
|
-
要獲得結果,必須取得一個 Collectable 並呼叫終端操作。
|
|
151
|
+
---
|
|
95
152
|
|
|
96
|
-
|
|
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
|
-
```
|
|
153
|
+
Важные правила использования
|
|
112
154
|
|
|
113
|
-
|
|
114
|
-
|
|
155
|
+
1. Потоки событий (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) возвращают `AsynchronousSemantic`.
|
|
156
|
+
→ Вы **должны** вызвать `.limit(n)`, `.sub(start, end)` или `.takeWhile()`, чтобы прекратить прослушивание. Иначе слушатель останется активным.
|
|
115
157
|
|
|
116
|
-
|
|
117
|
-
|
|
158
|
+
2. Терминальные операции (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` и т.д.) доступны только после преобразования в коллектор:
|
|
159
|
+
```typescript
|
|
160
|
+
.toUnordered() // O(n) время и память, без сортировки
|
|
161
|
+
// или
|
|
162
|
+
.toOrdered() // Отсортировано, сохраняет порядок
|
|
163
|
+
```
|
|
118
164
|
|
|
119
|
-
|
|
120
|
-
const first5Clicks = await useDocument('click')
|
|
121
|
-
.limit(5) // <- 關鍵:將串流限制為 5 個事件
|
|
122
|
-
.toUnordered()
|
|
123
|
-
.toArray();
|
|
165
|
+
---
|
|
124
166
|
|
|
125
|
-
|
|
126
|
-
const clicksIn10s = await useDocument('click')
|
|
127
|
-
.takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
|
|
128
|
-
.toUnordered()
|
|
129
|
-
.toArray();
|
|
167
|
+
### Характеристики производительности
|
|
130
168
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
169
|
+
| Коллектор | Временная сложность | Пространственная сложность | Отсортирован? | Лучше всего для |
|
|
170
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
171
|
+
| `toUnordered()` | O(n) | O(n) | Нет | Максимальная скорость, порядок не важен. |
|
|
172
|
+
| `toOrdered()` | O(2n) | O(n) | Да | Стабильный порядок, доступ по индексу, аналитика. |
|
|
173
|
+
| `toNumericStatistics()` | O(2n) | O(n) | Да | Статистические операции, требующие сортировки данных. |
|
|
174
|
+
| `toBigIntStatistics()` | O(2n) | O(n) | Да | Статистические операции для `bigint`. |
|
|
175
|
+
| `toWindow()` | O(2n) | O(n) | Да | Временные оконные операции. |
|
|
137
176
|
|
|
138
|
-
|
|
177
|
+
Выбирайте `toUnordered()`, когда важнее всего скорость. Используйте `toOrdered()` только когда вам требуется стабильный порядок или статистические методы, зависящие от отсортированных данных.
|
|
139
178
|
|
|
140
|
-
|
|
141
|
-
```typescript
|
|
142
|
-
const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
|
|
179
|
+
---
|
|
143
180
|
|
|
144
|
-
|
|
145
|
-
const median = await numericStream.median();
|
|
146
|
-
const standardDeviation = await numericStream.standardDeviation();
|
|
147
|
-
const skewness = await numericStream.skewness();
|
|
181
|
+
Сравнение с другими обработчиками потоков для фронтенда
|
|
148
182
|
|
|
149
|
-
|
|
150
|
-
|
|
183
|
+
| Особенность | Semantic-TypeScript | RxJS | Нативные асинхронные итераторы / Генераторы | Most.js |
|
|
184
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
185
|
+
| Интеграция с TypeScript | Первоклассная, с глубокой типизацией и встроенной осведомлённостью об индексах. | Отличная, но связана со сложными дженериками. | Хорошая, требует ручного описания типов. | Сильная, функционально-ориентированный стиль. |
|
|
186
|
+
| Встроенный статистический анализ | Полная нативная поддержка для `number` и `bigint`. | Недоступен нативно (требует пользовательских операторов). | Отсутствует. | Отсутствует. |
|
|
187
|
+
| Индексирование и осведомлённость о позиции | Нативное, мощное индексирование с помощью `bigint` для каждого элемента. | Требует пользовательских операторов (`scan`, `withLatestFrom`). | Требуется ручной счётчик. | Базовое, без встроенного индекса. |
|
|
188
|
+
| Управление потоками событий | Специализированные, типобезопасные фабрики с явным контролем ранней остановки. | Мощное, но требует ручного управления подписками. | Ручной слушатель событий + отмена. | Хороший `fromEvent`, лёгкий. |
|
|
189
|
+
| Производительность и эффективность памяти | Выдающаяся – оптимизированные коллекторы `toUnordered()` и `toOrdered()`. | Очень хорошая, но цепочки операторов добавляют накладные расходы. | Отличная (нулевые накладные расходы). | Отличная. |
|
|
190
|
+
| Размер бандла | Очень лёгкий. | Большой (даже с tree-shaking). | Нулевой (нативный). | Маленький. |
|
|
191
|
+
| Философия дизайна API | Функциональный паттерн коллекторов с явным индексированием. | Реактивный паттерн Observable. | Паттерн Итератор / Генератор. | Функциональный, бесточечный (`point-free`). |
|
|
192
|
+
| Ранняя остановка и контроль | Явный (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Хороший (`take`, `takeUntil`, `first`). | Ручной (`break` в `for await…of`). | Хороший (`take`, `until`). |
|
|
193
|
+
| Поддержка синхронных и асинхронных операций | Единый API – первоклассная поддержка обоих. | В основном асинхронный. | Оба, но ручной. | В основном асинхронный. |
|
|
194
|
+
| Кривая обучения | Пологая для разработчиков, знакомых с функциональными и индексированными конвейерами. | Круче (много операторов, горячие/холодные Observable). | Низкая. | Умеренная. |
|
|
151
195
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
```
|
|
196
|
+
Ключевые преимущества Semantic-TypeScript
|
|
197
|
+
|
|
198
|
+
• Уникальные встроенные возможности статистики и индексирования, устраняющие необходимость в ручном `reduce` или внешних библиотеках.
|
|
199
|
+
|
|
200
|
+
• Явный контроль над потоками событий предотвращает утечки памяти, типичные для RxJS.
|
|
201
|
+
|
|
202
|
+
• Единый синхронный/асинхронный дизайн предоставляет единый, последовательный API для различных случаев использования.
|
|
203
|
+
|
|
204
|
+
Это сравнение показывает, почему Semantic-TypeScript особенно хорошо подходит для современных TypeScript фронтенд-приложений, которые требуют производительности, типобезопасности и богатой аналитики без сложностей традиционных реактивных библиотек.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### Готовы исследовать?
|
|
209
|
+
|
|
210
|
+
Semantic-TypeScript превращает сложные потоки данных в читаемые, комбинируемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели — он предоставляет мощь индексирования уровня базы данных с элегантностью функционального программирования.
|
|
211
|
+
|
|
212
|
+
Следующие шаги:
|
|
213
|
+
|
|
214
|
+
• Изучите полностью типизированный API в своей IDE (все экспорты из основного пакета).
|
|
215
|
+
|
|
216
|
+
• Присоединяйтесь к растущему сообществу разработчиков, заменивших запутанные асинхронные итераторы на чистые конвейеры Semantic.
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
Semantic-TypeScript — где потоки встречаются со структурой.
|
|
211
220
|
|
|
212
|
-
|
|
221
|
+
Начните создавать сегодня и почувствуйте разницу, которую даёт продуманное индексирование.
|
|
213
222
|
|
|
214
|
-
|
|
223
|
+
Стройте ясно, действуйте уверенно и преобразуйте данные с намерением.
|