semantic-typescript 0.7.0 → 0.7.1
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/semantic.d.ts +4 -0
- package/dist/asynchronous/semantic.js +3 -0
- package/dist/factory.d.ts +24 -71
- package/dist/factory.js +161 -648
- package/dist/guard.d.ts +0 -3
- package/dist/guard.js +0 -19
- package/dist/hash.js +3 -0
- package/dist/synchronous/semantic.d.ts +4 -0
- package/dist/synchronous/semantic.js +4 -1
- package/package.json +1 -1
- package/readme.cn.md +185 -131
- package/readme.de.md +186 -132
- package/readme.es.md +186 -132
- package/readme.fr.md +188 -134
- package/readme.jp.md +185 -140
- package/readme.kr.md +184 -139
- package/readme.md +187 -130
- package/readme.ru.md +186 -143
- package/readme.tw.md +190 -146
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -6
package/readme.tw.md
CHANGED
|
@@ -1,223 +1,267 @@
|
|
|
1
|
-
# Semantic
|
|
2
|
-
|
|
1
|
+
# **Semantic‑TypeScript**
|
|
2
|
+
**串流處理,索引化。** 讓您的數據處於精準控制之下。
|
|
3
3
|
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
###
|
|
6
|
+
### 概述
|
|
7
7
|
|
|
8
|
-
Semantic
|
|
8
|
+
Semantic‑TypeScript 代表了串流處理領域的一次重大演進,它巧妙地**融合**了 JavaScript 產生器、Java Streams 和 MySQL 風格索引中最有效的典範。其核心理念強大而明確:透過智慧索引而非傳統的蠻力迭代,建構極其高效的資料處理管道。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
傳統的函式庫通常強制使用同步迴圈或笨重的 Promise 鏈,而 Semantic‑TypeScript 則提供了一個**完全非同步**、函數式純正且型別絕對安全的體驗,專為滿足現代應用程式開發的需求而設計。
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
該模型體現了一種精煉的控制流:資料僅在上游管道明確呼叫 `accept` 回呼時,才會傳遞給下游消費者。您可以對處理時機保持完全、細粒度的掌控——處理僅在需要時、且僅在要求的時刻發生。
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
###
|
|
16
|
+
### 開發者為何選擇 Semantic‑TypeScript
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
• Предсказуемая производительность — выбирайте между упорядоченными (`ordered`) и неупорядоченными (`unordered`) коллекторами в зависимости от ваших требований.
|
|
27
|
-
|
|
28
|
-
• Эффективное использование памяти — потоки вычисляются лениво, что снимает проблемы с памятью.
|
|
29
|
-
|
|
30
|
-
• Никакого неопределённого поведения — TypeScript гарантирует типобезопасность и обработку null/undefined. Входные данные остаются неизменными, если вы явно не изменяете их в своих функциях обратного вызова.
|
|
18
|
+
- **零模板索引** – 每個元素天生擁有其自然或自訂的索引,無需手動追蹤。
|
|
19
|
+
- **純函數式與型別安全** – 在支援不可變操作的同時,享受完整、地道的 TypeScript 型別推論。
|
|
20
|
+
- **無洩漏的事件串流** – `useSubscription` 模式將資源安全作為首要原則設計。您透過 `limit(n)`、`sub(start, end)` 或 `takeWhile(predicate)` 定義邏輯邊界,函式庫則管理完整的訂閱生命週期,確保沒有殘留的監聽器和記憶體洩漏。
|
|
21
|
+
- **內建統計套件** – 無需外部依賴,即可存取針對 `number` 和 `bigint` 串流的全面分析功能,包括平均值、中位數、眾數、變異數、偏態和峰態。
|
|
22
|
+
- **可預測、可調校的效能** – 根據您對效能和順序的精確需求,選擇有序或無序收集器。
|
|
23
|
+
- **天然的記憶體高效** – 串流採用惰性求值,按需處理元素以減輕記憶體壓力。
|
|
24
|
+
- **無未定義行為** – TypeScript 保證完整的型別安全性和可空性。除非在回呼函數中明確修改,否則您的來源資料保持不變。
|
|
31
25
|
|
|
32
26
|
---
|
|
33
27
|
|
|
34
|
-
###
|
|
28
|
+
### 安裝
|
|
29
|
+
|
|
30
|
+
使用您偏好的套件管理器將 Semantic‑TypeScript 整合到專案中:
|
|
35
31
|
|
|
36
32
|
```bash
|
|
37
33
|
npm install semantic-typescript
|
|
38
34
|
```
|
|
39
|
-
|
|
35
|
+
或
|
|
40
36
|
```bash
|
|
41
37
|
yarn add semantic-typescript
|
|
42
38
|
```
|
|
43
39
|
|
|
44
40
|
---
|
|
45
41
|
|
|
46
|
-
###
|
|
42
|
+
### 快速入門
|
|
43
|
+
|
|
44
|
+
以下範例演示了從基礎轉換到實際事件處理的核心概念。
|
|
47
45
|
|
|
48
46
|
```typescript
|
|
49
|
-
import { useOf, useFrom, useRange,
|
|
50
|
-
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
.
|
|
47
|
+
import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
|
|
48
|
+
|
|
49
|
+
// ====================================================================
|
|
50
|
+
// 範例 1: 基礎操作與數值統計
|
|
51
|
+
// ====================================================================
|
|
52
|
+
// 演示映射和終端統計操作。轉換後,管道必須轉換為統計收集器才能呼叫 `.summate()` 等終端方法。
|
|
53
|
+
|
|
54
|
+
const numericSum: number = useOf(10, 20, 30, 40)
|
|
55
|
+
.map((n: number): number => n * 2) // 每個元素翻倍: [20, 40, 60, 80]
|
|
56
|
+
.toNumericStatistics() // 轉換為統計收集器
|
|
57
|
+
.summate(); // 終端操作: 200
|
|
58
|
+
|
|
59
|
+
// 其他統計方法(在 .toNumericStatistics() 後可用):
|
|
60
|
+
// .average(), .median(), .mode(), .variance(), .skewness(), .kurtosis()
|
|
61
|
+
|
|
62
|
+
// ====================================================================
|
|
63
|
+
// 範例 2: BigInt 統計
|
|
64
|
+
// ====================================================================
|
|
65
|
+
// 與數值統計操作相同,但針對 BigInt 資料進行了最佳化。
|
|
66
|
+
|
|
67
|
+
const bigintSum: bigint = useOf(10n, 20n, 30n, 40n)
|
|
68
|
+
.map((n: bigint): bigint => n * 2n) // BigInt 算術
|
|
69
|
+
.toBigIntStatistics() // 轉換為 BigInt 統計收集器
|
|
70
|
+
.summate(); // 終端操作: 200n
|
|
71
|
+
|
|
72
|
+
// ====================================================================
|
|
73
|
+
// 範例 3: 透過索引操作實現串流反轉
|
|
74
|
+
// ====================================================================
|
|
75
|
+
// 使用 `.redirect()` 方法透過策略性地重新分配元素索引來說明如何重新排序元素,從而實現反轉等自訂模式。
|
|
76
|
+
|
|
77
|
+
const reversedArray: number[] = useFrom([1, 2, 3, 4, 5])
|
|
78
|
+
.redirect((_element: number, index: bigint): bigint => -index) // 映射到負索引
|
|
79
|
+
.toOrdered() // 關鍵步驟:按新索引收集並排序元素
|
|
80
|
+
.toArray(); // 結果: [5, 4, 3, 2, 1]
|
|
81
|
+
|
|
82
|
+
// 對於簡單的反轉,`.reverse()` 方法同樣可用。
|
|
83
|
+
|
|
84
|
+
// ====================================================================
|
|
85
|
+
// 範例 4: 串流洗牌
|
|
86
|
+
// ====================================================================
|
|
87
|
+
// 使用原地洗牌演算法隨機置換元素索引。
|
|
88
|
+
|
|
89
|
+
const shuffledArray: number[] = useFrom([1, 2, 3, 4, 5])
|
|
90
|
+
.shuffle() // 隨機重新分配索引
|
|
91
|
+
.toOrdered() // 按新的隨機索引排序
|
|
92
|
+
.toArray(); // 例如: [2, 5, 1, 4, 3] (每次執行結果不同)
|
|
93
|
+
|
|
94
|
+
// ====================================================================
|
|
95
|
+
// 範例 5: 循環串流旋轉
|
|
96
|
+
// ====================================================================
|
|
97
|
+
// 循環移動元素。正值向右旋轉;負值向左旋轉。
|
|
98
|
+
|
|
99
|
+
// 向右旋轉 2 個位置
|
|
100
|
+
const rightRotated: number[] = useFrom([1, 2, 3, 4, 5])
|
|
101
|
+
.translate(2) // 將索引向右移動 2
|
|
72
102
|
.toOrdered()
|
|
73
|
-
.toArray();
|
|
103
|
+
.toArray(); // 結果: [4, 5, 1, 2, 3]
|
|
74
104
|
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
.toArray(); // [4, 5, 1, 2, 3]
|
|
105
|
+
// ====================================================================
|
|
106
|
+
// 範例 6: 無限範圍的惰性求值
|
|
107
|
+
// ====================================================================
|
|
108
|
+
// 惰性地處理理論上的無限串流,僅在需要時計算元素。
|
|
80
109
|
|
|
81
|
-
|
|
82
|
-
.
|
|
83
|
-
.
|
|
84
|
-
.
|
|
110
|
+
const firstTenMultiples: bigint[] = useRange(0n, 1_000_000n)
|
|
111
|
+
.filter(n => n % 17n === 0n) // 保留 17 的倍數
|
|
112
|
+
.limit(10n) // 關鍵:在第 10 個匹配項後停止
|
|
113
|
+
.toUnordered() // 不需要排序
|
|
114
|
+
.toArray(); // 結果: [0, 17, 34, 51, 68, 85, 102, 119, 136, 153]
|
|
85
115
|
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
116
|
+
// 沒有 `.limit(10n)` 的話,管道將處理所有一百萬個元素。
|
|
117
|
+
|
|
118
|
+
// ====================================================================
|
|
119
|
+
// 範例 7: 組合複雜管道
|
|
120
|
+
// ====================================================================
|
|
121
|
+
// 演示多個操作的順序組合。
|
|
122
|
+
|
|
123
|
+
const complexResult: number[] = useRange(1n, 100n)
|
|
124
|
+
.map(n => Number(n) * 2)
|
|
125
|
+
.filter(n => n > 50)
|
|
126
|
+
.shuffle()
|
|
127
|
+
.limit(5n)
|
|
128
|
+
.translate(2)
|
|
129
|
+
.toOrdered()
|
|
91
130
|
.toArray();
|
|
92
131
|
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
132
|
+
// ====================================================================
|
|
133
|
+
// 範例 8: 託管 DOM 事件訂閱
|
|
134
|
+
// ====================================================================
|
|
135
|
+
// 監聽瀏覽器事件,並附帶自動、無洩漏的清理功能。
|
|
136
|
+
// `.limit(n)` 呼叫定義了自動移除監聽器的邊界。
|
|
137
|
+
|
|
138
|
+
// 為 Window 目標定義一個訂閱者
|
|
139
|
+
const windowSubscriber = {
|
|
140
|
+
mount: (target: Window): void => { /* 設定邏輯 */ },
|
|
141
|
+
subscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
|
|
142
|
+
target.addEventListener(event, handler);
|
|
143
|
+
},
|
|
144
|
+
unsubscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
|
|
145
|
+
target.removeEventListener(event, handler);
|
|
146
|
+
},
|
|
147
|
+
unmount: (): void => { /* 清理邏輯 */ }
|
|
148
|
+
};
|
|
98
149
|
|
|
99
|
-
|
|
100
|
-
//
|
|
101
|
-
useHTMLElement("#input", "change")
|
|
102
|
-
.limit(1)
|
|
150
|
+
useSubscription(window, windowSubscriber, "resize")
|
|
151
|
+
.limit(5n) // 5 個事件後自動取消訂閱
|
|
103
152
|
.toUnordered()
|
|
104
|
-
.forEach((
|
|
153
|
+
.forEach((ev: Event, idx) =>
|
|
154
|
+
console.log(`調整大小 #${idx}: ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
|
|
155
|
+
);
|
|
105
156
|
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
.forEach((event: Event) => submit(event));
|
|
111
|
-
|
|
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));
|
|
157
|
+
// ====================================================================
|
|
158
|
+
// 範例 9: 按 Unicode 碼點處理字串
|
|
159
|
+
// ====================================================================
|
|
160
|
+
// 正確地遍歷一個字串,處理多位元組 Unicode 字元。
|
|
121
161
|
|
|
122
|
-
// Итерация по строке по кодовым точкам
|
|
123
162
|
useText("My emotion now is: 😊, and semantic is 👍")
|
|
124
163
|
.toUnordered()
|
|
125
|
-
.log(); //
|
|
164
|
+
.log(); // 將每個字元(包括表情符號)在新行列印。
|
|
165
|
+
|
|
166
|
+
// ====================================================================
|
|
167
|
+
// 範例 10: 安全的循環引用字串化
|
|
168
|
+
// ====================================================================
|
|
169
|
+
// 安全地序列化包含循環引用的物件。
|
|
126
170
|
|
|
127
|
-
|
|
128
|
-
let o = {
|
|
171
|
+
const obj = {
|
|
129
172
|
a: 1,
|
|
130
|
-
b: "text"
|
|
131
|
-
c: [o.a, o.b, o.c] // Циклическая ссылка
|
|
173
|
+
b: "text"
|
|
132
174
|
};
|
|
133
|
-
|
|
134
|
-
|
|
175
|
+
(obj as any).c = [obj.a, obj.b, (obj as any).c]; // 引入循環引用
|
|
176
|
+
|
|
177
|
+
// const text: string = JSON.stringify(obj); // 拋出錯誤
|
|
178
|
+
const text: string = useStringify(obj); // 安全地產生 `{a: 1, b: "text", c: []}`
|
|
135
179
|
```
|
|
136
180
|
|
|
137
181
|
---
|
|
138
182
|
|
|
139
|
-
###
|
|
183
|
+
### 核心概念
|
|
140
184
|
|
|
141
|
-
|
|
|
185
|
+
| 概念 | 目的 | 主要使用場景 |
|
|
142
186
|
| :--- | :--- | :--- |
|
|
143
|
-
| `AsynchronousSemantic` |
|
|
144
|
-
| `SynchronousSemantic` |
|
|
145
|
-
| `toUnordered()` |
|
|
146
|
-
| `toOrdered()` |
|
|
147
|
-
| `toNumericStatistics()` |
|
|
148
|
-
| `toBigIntStatistics()` |
|
|
149
|
-
| `toWindow()` |
|
|
187
|
+
| `AsynchronousSemantic` | 用於非同步串流、事件和基於推送的惰性管道的核心建構器。 | 即時事件、WebSockets、DOM 監聽器或任何長時間執行/無限串流。 |
|
|
188
|
+
| `SynchronousSemantic` | 用於同步、記憶體中或基於拉取的急切串流的建構器。 | 靜態資料、有限範圍或需要立即迭代的任務。 |
|
|
189
|
+
| `toUnordered()` | 最快的終端收集器,使用 Map 儲存索引。 | 效能關鍵路徑,且不需要穩定順序的場景(O(n) 時間和空間)。 |
|
|
190
|
+
| `toOrdered()` | 有序、索引穩定的終端收集器。 | 當需要保持元素順序或需要索引存取時。 |
|
|
191
|
+
| `toNumericStatistics()` | 啟用對 `number` 串流進行豐富統計分析功能的收集器。 | 資料分析、指標和統計計算。 |
|
|
192
|
+
| `toBigIntStatistics()` | 啟用對 `bigint` 串流進行豐富統計分析功能的收集器。 | 大型整數資料集的分析和統計。 |
|
|
193
|
+
| `toWindow()` | 提供對串流進行滑動和滾動視窗操作的功能。 | 時間序列分析、批次處理和視窗聚合。 |
|
|
150
194
|
|
|
151
195
|
---
|
|
152
196
|
|
|
153
|
-
|
|
197
|
+
**基本使用規則**
|
|
154
198
|
|
|
155
|
-
1.
|
|
156
|
-
→
|
|
199
|
+
1. **事件串流**(透過 `useSubscription` 等工廠函數建立)返回一個 `AsynchronousSemantic`。
|
|
200
|
+
→ 您**必須**呼叫一個定義邊界的方法,如 `.limit(n)`、`.sub(start, end)` 或 `.takeWhile(predicate)` 來終止監聽器。否則訂閱將保持活動狀態。
|
|
157
201
|
|
|
158
|
-
2.
|
|
202
|
+
2. **終端操作**(`.toArray()`、`.count()`、`.forEach()`、`.findFirst()` 等)**僅在**將管道轉換為收集器**之後**可用:
|
|
159
203
|
```typescript
|
|
160
|
-
.toUnordered() //
|
|
161
|
-
//
|
|
162
|
-
.toOrdered() //
|
|
204
|
+
.toUnordered() // 用於最大速度,不保證順序。
|
|
205
|
+
// 或
|
|
206
|
+
.toOrdered() // 用於穩定、有序的輸出。
|
|
207
|
+
// 或
|
|
208
|
+
.toNumericStatistics() // 用於統計方法。
|
|
163
209
|
```
|
|
164
210
|
|
|
165
211
|
---
|
|
166
212
|
|
|
167
|
-
###
|
|
213
|
+
### 效能特徵
|
|
168
214
|
|
|
169
|
-
|
|
|
215
|
+
| 收集器 | 時間複雜度 | 空間複雜度 | 保證順序? | 理想場景 |
|
|
170
216
|
| :--- | :--- | :--- | :--- | :--- |
|
|
171
|
-
| `toUnordered()` | O(n) | O(n) |
|
|
172
|
-
| `toOrdered()` | O(
|
|
173
|
-
| `toNumericStatistics()` | O(
|
|
174
|
-
| `toBigIntStatistics()` | O(
|
|
175
|
-
| `toWindow()` | O(
|
|
217
|
+
| `toUnordered()` | O(n) | O(n) | 否 | 原始吞吐量是關鍵;最終順序無關緊要。 |
|
|
218
|
+
| `toOrdered()` | O(n log n) | O(n) | 是(已排序) | 需要穩定順序、索引存取或為統計進行預排序。 |
|
|
219
|
+
| `toNumericStatistics()` | O(n log n) | O(n) | 是(內部排序) | 執行需要排序資料的統計操作。 |
|
|
220
|
+
| `toBigIntStatistics()` | O(n log n) | O(n) | 是(內部排序) | 對 BigInt 資料進行統計操作。 |
|
|
221
|
+
| `toWindow()` | O(n log n) | O(n) | 是(內部排序) | 能從排序索引中受益的視窗操作。 |
|
|
176
222
|
|
|
177
|
-
|
|
223
|
+
當絕對速度至關重要時,選擇 `toUnordered()`。僅當您的邏輯依賴於元素順序時,才選擇 `toOrdered()` 或統計收集器。
|
|
178
224
|
|
|
179
225
|
---
|
|
180
226
|
|
|
181
|
-
|
|
227
|
+
**與現代串流處理函式庫的對比分析**
|
|
182
228
|
|
|
183
|
-
|
|
|
229
|
+
| 特性 | Semantic‑TypeScript | RxJS | 原生 Async Iterators / Generators | Most.js |
|
|
184
230
|
| :--- | :--- | :--- | :--- | :--- |
|
|
185
|
-
|
|
|
186
|
-
|
|
|
187
|
-
|
|
|
188
|
-
|
|
|
189
|
-
|
|
|
190
|
-
|
|
|
191
|
-
|
|
|
192
|
-
|
|
|
193
|
-
|
|
|
194
|
-
|
|
|
231
|
+
| **TypeScript 整合** | 一等公民,深度型別化,具有固有的索引感知。 | 優秀,但通常涉及複雜的泛型鏈。 | 良好,但需要手動型別註解。 | 強大,採用函數優先的編碼風格。 |
|
|
232
|
+
| **內建統計分析** | 對 `number` 和 `bigint` 提供全面的原生支援。 | 非原生支援(需要自訂運算符或其他函式庫)。 | 無。 | 無。 |
|
|
233
|
+
| **索引與位置感知** | 原生、強大的 BigInt 索引,每個元素都具備。 | 需要自訂運算符(如 `scan`、`withLatestFrom`)。 | 需要手動管理計數器。 | 基礎,無內建索引屬性。 |
|
|
234
|
+
| **事件串流管理** | 專用的、型別安全的工廠,具有明確、宣告式的生命週期控制。 | 強大但需要謹慎的手動訂閱管理以防止洩漏。 | 手動事件監聽器附加和取消權杖管理。 | 良好的 `fromEvent`,通常較輕量。 |
|
|
235
|
+
| **效能與記憶體** | 卓越 – 提供最佳化的 `toUnordered()` 和 `toOrdered()` 收集器。 | 非常好,但深度運算符鏈可能引入開銷。 | 優秀(最小的原生開銷)。 | 優秀。 |
|
|
236
|
+
| **套件體積** | 非常輕量。 | 較大(即使有 tree-shaking)。 | 零(原生語言特性)。 | 小。 |
|
|
237
|
+
| **API 設計理念** | 具有明確索引語義的函數式收集器模式。 | 響應式 Observable 模式。 | 命令式 Iterator / 宣告式 Generator 模式。 | 函數式、無點組合。 |
|
|
238
|
+
| **流控制** | 顯式(`interrupt`、`.limit()`、`.takeWhile()`、`.sub()`)。 | 良好(`take`、`takeUntil`、`first`)。 | 手動(迴圈中的 `break`)。 | 良好(`take`、`until`)。 |
|
|
239
|
+
| **同步與非同步支援** | 統一的 API – 對兩種典範都提供一等公民支援。 | 主要面向非同步。 | 兩者都支援,但需要手動橋接。 | 主要面向非同步。 |
|
|
240
|
+
| **學習曲線** | 對於熟悉函數式和索引集合管道的開發者來說較平緩。 | 較陡峭(大量的運算符詞彙、熱/冷 Observable 概念)。 | 低到中等。 | 中等。 |
|
|
195
241
|
|
|
196
|
-
|
|
242
|
+
**Semantic‑TypeScript 的優勢**
|
|
197
243
|
|
|
198
|
-
|
|
244
|
+
* **獨特能力:** 整合的統計和索引功能,無需手動 `reduce` 操作或輔助的資料分析函式庫。
|
|
245
|
+
* **可預測的資源管理:** 對事件串流的顯式控制,防止了 RxJS 應用中可能出現的微妙記憶體洩漏。
|
|
246
|
+
* **統一設計:** 同步和非同步工作流採用一致的 API,減少了認知負擔和程式碼重複。
|
|
199
247
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
• Единый синхронный/асинхронный дизайн предоставляет единый, последовательный API для различных случаев использования.
|
|
203
|
-
|
|
204
|
-
Это сравнение показывает, почему Semantic-TypeScript особенно хорошо подходит для современных TypeScript фронтенд-приложений, которые требуют производительности, типобезопасности и богатой аналитики без сложностей традиционных реактивных библиотек.
|
|
248
|
+
此對比凸顯了為何 Semantic‑TypeScript 特別適合需要高效能、健壯的型別安全性和豐富資料處理功能,而又不希望引入傳統響應式框架複雜性的現代 TypeScript 應用程式。
|
|
205
249
|
|
|
206
250
|
---
|
|
207
251
|
|
|
208
|
-
###
|
|
209
|
-
|
|
210
|
-
Semantic-TypeScript превращает сложные потоки данных в читаемые, комбинируемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели — он предоставляет мощь индексирования уровня базы данных с элегантностью функционального программирования.
|
|
252
|
+
### 開始探索
|
|
211
253
|
|
|
212
|
-
|
|
254
|
+
Semantic‑TypeScript 將複雜的資料流轉化為可讀、可組合且高效能的管道。無論您是在處理即時 UI 事件、處理大量資料集,還是建構分析儀表板,它都能提供資料庫級索引的強大功能與函數式程式設計的優雅。
|
|
213
255
|
|
|
214
|
-
|
|
256
|
+
**您的後續步驟:**
|
|
215
257
|
|
|
216
|
-
|
|
258
|
+
* 直接在您的 IDE 中探索完全型別化的 API(所有匯出都可在主套件入口點找到)。
|
|
259
|
+
* 加入不斷壯大的開發者社群,他們已用清晰、有意的 Semantic 管道替代了複雜的非同步迭代器和響應式鏈。
|
|
217
260
|
|
|
261
|
+
**Semantic‑TypeScript** – 流與結構的交匯點。
|
|
218
262
|
|
|
219
|
-
|
|
263
|
+
立即開始建構,體驗深思熟慮的索引設計所帶來的切實差異。
|
|
220
264
|
|
|
221
|
-
|
|
265
|
+
**清晰建構,自信前行,以意圖驅動資料轉換。**
|
|
222
266
|
|
|
223
|
-
|
|
267
|
+
MIT © Eloy Kim
|
package/dist/main.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/main.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { useHTMLElement } from "./factory";
|
|
2
|
-
let input = document.createElement("input");
|
|
3
|
-
input.type = "text";
|
|
4
|
-
input.placeholder = "Enter your name";
|
|
5
|
-
document.body.appendChild(input);
|
|
6
|
-
useHTMLElement(input, ["click", "change"]).peek(console.log).limit(5).toUnordered().log();
|