fastevent 2.3.6 → 2.3.7

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/index.d.mts CHANGED
@@ -1,92 +1,842 @@
1
- type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
1
+ import { Sum, LessThan, ValueOf as ValueOf$1, Subtract, UnionToTuple as UnionToTuple$1 } from 'type-fest';
2
2
 
3
- type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener;
3
+ type RemoveAnyRecord<T extends Record<string, any>> = T extends Record<string, any> & (infer X) ? X extends Record<string, any> ? X : Record<string, any> : T;
4
+
5
+ type Split<S extends string, Delimiter extends string = "/"> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S];
6
+
7
+ type Join<T extends string[], Delimiter extends string = "/"> = T extends [
8
+ infer First extends string,
9
+ ...infer Rest extends string[]
10
+ ] ? Rest["length"] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : "";
11
+
12
+ type Decrement<N extends number> = N extends 0 ? 0 : N extends 1 ? 0 : N extends 2 ? 1 : N extends 3 ? 2 : N extends 4 ? 3 : N extends 5 ? 4 : N extends 6 ? 5 : N extends 7 ? 6 : N extends 8 ? 7 : N extends 9 ? 8 : number;
13
+
14
+ type Slice<T extends any[], Start extends number, Result extends any[] = []> = Start extends 0 ? T : T extends [infer _First, ...infer Rest] ? Slice<Rest, Decrement<Start>, Result> : Result;
15
+
16
+ type MatchPatternAndGetRemainder<KeyParts extends string[], PrefixParts extends string[], Result extends string[] = []> = PrefixParts["length"] extends 0 ? KeyParts["length"] extends 0 ? never : KeyParts : KeyParts["length"] extends 0 ? never : KeyParts[0] extends PrefixParts[0] | "*" ? MatchPatternAndGetRemainder<Slice<KeyParts, 1>, Slice<PrefixParts, 1>, Result> : never;
17
+ type ScopeEventsImpl<Events extends Record<string, any>, Prefix extends string> = {
18
+ [K in keyof Events as K extends string ? MatchPatternAndGetRemainder<Split<K, "/">, Split<Prefix, "/">> extends infer Remainder ? Remainder extends string[] ? Join<Remainder, "/"> : never : never : never]: Events[K];
19
+ };
20
+ /**
21
+ *
22
+ * 返回指定前缀的作用域事件列表
23
+ *
24
+ * - 当 Prefix = '' 时,直接返回 Events
25
+ * - 当没有事件匹配 Prefix 时,返回 Default
26
+ *
27
+ */
28
+ type ScopeEvents<Events extends Record<string, any>, Prefix extends string, Default extends Record<string, any> = Record<string, any>> = Prefix extends "" ? Events : [keyof ScopeEventsImpl<Events, Prefix>] extends [never] ? Default : ScopeEventsImpl<Events, Prefix>;
4
29
 
5
- type Expand$1<T> = T extends infer O ? {
30
+ type ContainsWildcard<T extends string> = T extends `${string}/*/${string}` ? true : T extends `${string}/*` ? true : T extends `*/${string}` ? true : T extends `*` | `**` ? true : T extends `${string}/**` ? true : false;
31
+
32
+ type IsAny<T> = 0 extends 1 & T ? true : false;
33
+
34
+ /**
35
+ * 移除空对象类型约束
36
+ * @description 从类型中移除空的字面量类型约束,返回基础类型
37
+ * @example
38
+ * type Result = RemoveEmptyObject<{} & string>;
39
+ * // Result = string
40
+ */
41
+ type RemoveEmptyObject<T extends Record<string, any>> = T extends {} & (infer O) ? O : T;
42
+
43
+ /**
44
+ * 断言类型为记录类型
45
+ * @description 如果类型 T 是 Record<string, any> 的子类型,返回 T;否则返回 Record<string, any>
46
+ * @example
47
+ * type Result1 = AssertRecord<{ a: 1 }>;
48
+ * // Result1 = { a: 1 }
49
+ * type Result2 = AssertRecord<string>;
50
+ * // Result2 = Record<string, any>
51
+ */
52
+ type AssertRecord<T> = T extends Record<string, any> ? T : Record<string, any>;
53
+
54
+ /**
55
+ * 展开联合类型的成员
56
+ * @description 将联合类型的每个成员展开为独立对象,再重新组合
57
+ * @example
58
+ * type Result = Union<{ a: 1 } | { b: 2 }>;
59
+ * // Result = { a: 1 } | { b: 2 }
60
+ */
61
+ type Union<T> = T extends infer O ? {
6
62
  [K in keyof O]: O[K];
7
63
  } : never;
8
- type ContainsWildcard<T extends string> = T extends `${string}/*/${string}` ? true : T extends `${string}/*` ? true : T extends `*/${string}` ? true : T extends `*` ? true : false;
9
- type ReplaceWildcard<T extends string> = T extends `*${infer Rest}` ? `${string}${ReplaceWildcard<Rest>}` : T extends `${infer Head}*${infer Rest}` ? `${Head}${string}${ReplaceWildcard<Rest>}` : T;
10
- type WildcardKeys<T> = {
11
- [K in keyof T]: K extends string ? (ContainsWildcard<K> extends true ? K : never) : never;
12
- }[keyof T];
13
- type ExpandWildcard<T extends Record<string, any>> = Expand$1<T & {
14
- [K in WildcardKeys<T> as ReplaceWildcard<K>]: T[K];
15
- }>;
16
64
 
65
+ /**
66
+ * 断言类型为字符串类型
67
+ * @description 如果类型 T 是 string 的子类型,返回 T;否则返回 string
68
+ * @example
69
+ * type Result1 = AssertString<"hello">;
70
+ * // Result1 = "hello"
71
+ * type Result2 = AssertString<number>;
72
+ * // Result2 = string
73
+ */
74
+ type AssertString<T> = T extends string ? T : string;
75
+
76
+ /**
77
+ * 判断两个类型是否相等
78
+ * @description 使用函数返回类型来比较两个类型是否完全相同
79
+ */
80
+ type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;
81
+
82
+ type NotEqual<X, Y> = true extends Equal<X, Y> ? false : true;
83
+
84
+ /**
85
+ * 将事件映射转换为可变联合类型
86
+ * 根据事件的键名确定 type 字段,根据事件的值确定 payload 字段
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * type Events = {
91
+ * a: number;
92
+ * b: boolean;
93
+ * };
94
+ *
95
+ * type Result = MutableRecord<Events>;
96
+ * // Result = { type: "a"; payload: number } | { type: "b"; payload: boolean }
97
+ * ```
98
+ */
99
+
100
+ type MutableRecord<Items, KindKey extends string = "type", Share = unknown, DefaultKind extends keyof Items = never> = {
101
+ [Kind in keyof Items]: Union<{
102
+ [type in KindKey]: Kind;
103
+ } & Items[Kind] & Share>;
104
+ }[Exclude<keyof Items, DefaultKind>] | (DefaultKind extends never ? never : Union<{
105
+ [K in KindKey]?: DefaultKind | undefined;
106
+ } & Items[DefaultKind] & Share>);
107
+
108
+ type KeyOf<T extends Record<string, any>> = Exclude<keyof T, number | symbol> extends never ? string : Exclude<keyof T, number | symbol>;
109
+
110
+ /**
111
+ * 当类型为 never 或 undefined 时返回默认值
112
+ * @description 如果 T 是 never 或 undefined,返回默认值 F;否则返回原类型 T
113
+ * @example
114
+ * type Result1 = Fallback<never, string>;
115
+ * // Result1 = string
116
+ * type Result2 = Fallback<number, string>;
117
+ * // Result2 = number
118
+ * type Result3 = Fallback<undefined, string>;
119
+ * // Result3 = string
120
+ */
121
+ type Fallback<T, F> = [T] extends [never] ? F : T extends undefined ? F : T;
122
+
123
+ /**
124
+ * 检查对象类型是否为空
125
+ * @description 判断对象类型是否没有任何属性
126
+ * @example
127
+ * type Result1 = isEmpty<{}>;
128
+ * // Result1 = true
129
+ * type Result2 = isEmpty<{ a: 1 }>;
130
+ * // Result2 = false
131
+ */
132
+ type isEmpty<T extends Record<string, any>> = [keyof T] extends [never] ? true : false;
133
+
134
+ /**
135
+ * 提取出精确等于指定键的记录
136
+ * @description 从对象类型中提取出键精确等于指定字符串的属性
137
+ * @example
138
+ * type Result = PickEqualRecord<{ a: 1; b: 2; c: 3 }, "a">;
139
+ * // Result = { a: 1 }
140
+ */
141
+ type PickEqualRecord<R extends Record<string, any>, T extends string> = {
142
+ [K in keyof R as Equal<K, T> extends true ? K : never]: R[K];
143
+ };
144
+
145
+ /**
146
+ * 提取出精确不等于指定键的记录
147
+ * @description 从对象类型中提取出键不精确等于指定字符串的属性
148
+ * @example
149
+ * type Result = PickNotEqualRecord<{ a: 1; b: 2; c: 3 }, "a">;
150
+ * // Result = { b: 2; c: 3 }
151
+ */
152
+ type PickNotEqualRecord<R extends Record<string, any>, T extends string> = {
153
+ [K in keyof R as Equal<K, T> extends true ? never : K]: R[K];
154
+ };
155
+
156
+ /**
157
+ * 提取键中包含分隔符的记录
158
+ * @description 从对象类型中提取出键包含 "/" 分隔符的属性
159
+ * @example
160
+ * type Result = PickInlcudeDelimiterRecord<{ "user/login": 1; logout: 2 }>;
161
+ * // Result = { "user/login": 1 }
162
+ */
163
+ type PickInlcudeDelimiterRecord<R extends Record<string, any>> = {
164
+ [K in keyof R as K extends `${string}/${string}` ? K : never]: R[K];
165
+ };
166
+
167
+ /**
168
+ * 提取键中不包含分隔符的记录
169
+ * @description 从对象类型中提取出键不包含 "/" 分隔符的属性
170
+ * @example
171
+ * type Result = PickNotInlcudeDelimiterRecord<{ "user/login": 1; logout: 2 }>;
172
+ * // Result = { logout: 2 }
173
+ */
174
+ type PickNotInlcudeDelimiterRecord<R extends Record<string, any>> = {
175
+ [K in keyof R as K extends `${string}/${string}` ? never : K]: R[K];
176
+ };
177
+
178
+ /**
179
+ * 展开类型,使交集类型合并为单一对象类型
180
+ * @description 展开交叉类型和映射类型,使类型更容易阅读
181
+ * @example
182
+ * type Result = Expand<{ a: 1 } & { b: 2 }>;
183
+ * // Result = { a: 1; b: 2 }
184
+ */
185
+ type Expand<T> = T extends infer O ? {
186
+ [K in keyof O]: O[K];
187
+ } : never;
188
+
189
+ /**
190
+ * 将对象的键转换为元组类型
191
+ * @description 将对象类型的键转换为元组类型,保留所有键
192
+ * @example
193
+ * type Result = Keys<{ a: 1; b: 2; c: 3 }>;
194
+ * // Result = ["a", "b", "c"]
195
+ */
196
+ /**
197
+ * 将联合类型转换为元组类型的辅助类型
198
+ */
17
199
  type UnionToTuple<T> = UnionToTupleRec<T, []>;
18
200
  type UnionToTupleRec<T, R extends any[]> = [T] extends [never] ? R : UnionToTupleRec<Exclude<T, LastOfUnion<T>>, [LastOfUnion<T>, ...R]>;
19
- type LastOfUnion<T> = UnionToIntersection<T extends any ? (x: T) => 0 : never> extends (x: infer L) => 0 ? L : never;
20
- type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
201
+ /**
202
+ * 获取联合类型的最后一个成员
203
+ */
204
+ type LastOfUnion<T> = UnionToIntersection$1<T extends any ? (x: T) => 0 : never> extends (x: infer L) => 0 ? L : never;
205
+ type UnionToIntersection$1<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
21
206
  type Keys<T extends Record<string, any>> = UnionToTuple<keyof T>;
22
207
 
208
+ /**
209
+ * 获取对象的第一个属性
210
+ * @description 从对象类型中提取出第一个键值对
211
+ * @example
212
+ * type Result = FirstObjectItem<{ a: 1; b: 2; c: 3 }>;
213
+ * // Result = { a: 1 }
214
+ */
215
+ type FirstObjectItem<T extends Record<string, any>> = Pick<T, Keys<T> extends any[] ? Keys<T>[0] : never>;
216
+
217
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
218
+
219
+ /**
220
+ * 获取联合类型的第一个成员
221
+ * @description 从联合类型中提取出第一个成员类型
222
+ * @example
223
+ * type Result = FirstOfUnion<"a" | "b" | "c">;
224
+ * // Result = "a"
225
+ */
226
+ type FirstOfUnion<T> = UnionToIntersection<T extends any ? (x: T) => any : never> extends (x: infer U) => any ? U : never;
227
+
228
+ /**
229
+ * 检查类型是否为多级通配符(包含 **)
230
+ * @description 判断字符串类型是否包含多级通配符 "**"
231
+ * @example
232
+ * type Result1 = IsMultiWildcard<"user/**">;
233
+ * // Result1 = true
234
+ * type Result2 = IsMultiWildcard<"user/*">;
235
+ * // Result2 = false
236
+ * type Result3 = IsMultiWildcard<**">;
237
+ * // Result3 = true
238
+ */
239
+ type IsMultiWildcard<T extends string> = T extends `${string}/**` | "**" ? true : false;
240
+
241
+ /**
242
+ * 在数字前面追加数字
243
+ * @example PrefixNumber<123, 99> = 99123
244
+ */
245
+ type PrefixNumber<T extends number, P extends number> = `${P}${T}` extends `${infer R extends number}` ? R : never;
246
+
247
+ /**
248
+ * 将记录类型转换为键值对联合类型
249
+ * @example ExpandRecord<{ a: 1; b: 2 }> = ["a", 1] | ["b", 2]
250
+ */
251
+ type ExpandRecord<T extends Record<string, any>> = {
252
+ [K in keyof T]: [K, T[K]];
253
+ }[keyof T];
254
+
255
+ /**
256
+ * 检查类型是否为 never
257
+ * @description 判断类型是否为 TypeScript 的 never 类型
258
+ * @example
259
+ * type Result1 = IsNever<never>;
260
+ * // Result1 = true
261
+ * type Result2 = IsNever<string>;
262
+ * // Result2 = false
263
+ */
264
+ type IsNever<T> = [T] extends [never] ? true : false;
265
+
266
+ /**
267
+ * 如果类型为 never,返回默认值;否则返回原类型
268
+ * @description 条件类型工具,当类型为 never 时提供默认值
269
+ * @example
270
+ * type Result1 = IfNever<never, string>;
271
+ * // Result1 = string
272
+ * type Result2 = IfNever<number, string>;
273
+ * // Result2 = number
274
+ */
275
+ type IfNever<T, Default> = IsNever<T> extends true ? Default : T;
276
+
277
+ /**
278
+ * 分割路径为数组(支持没有 / 的情况)
279
+ *
280
+ * 处理逻辑:
281
+ * - 如果有 /,按 / 分割成多段数组
282
+ * - 如果没有 /,返回包含单个元素的数组 [原字符串]
283
+ * - 空字符串会返回 [""]
284
+ *
285
+ * @example
286
+ * - SplitPath<"a/b/c"> => ["a", "b", "c"]
287
+ * - SplitPath<"click"> => ["click"]
288
+ * - SplitPath<"*"> => ["*"]
289
+ * - SplitPath<""> => [""]
290
+ */
291
+
292
+ type SplitPath<T extends string> = Split<T>;
293
+
294
+ /**
295
+ * 返回对象的所有Keys
296
+ */
297
+ type ObjectKeys<T, I = string> = {
298
+ [P in keyof T]: P extends I ? P : never;
299
+ }[keyof T];
300
+
301
+ type Add<A extends number, B extends number> = Sum<A, B>;
302
+
303
+ type Min<T extends number[], M extends number = T[0]> = T extends [infer F, ...infer R] ? F extends number ? R extends number[] ? LessThan<F, M> extends true ? Min<R, F> : Min<R, M> : M : M : M;
304
+
305
+ type IndexOfMin<T extends number[], M = Min<T>, Idx extends any[] = []> = T extends [
306
+ infer F,
307
+ ...infer R extends number[]
308
+ ] ? F extends M ? Idx["length"] : IndexOfMin<R, M, [...Idx, any]> : never;
309
+
310
+ type Max<T extends number[], M extends number = T[0]> = T extends [infer F, ...infer R] ? F extends number ? R extends number[] ? LessThan<F, M> extends true ? Max<R, M> : Max<R, F> : M : M : M;
311
+
312
+ type IndexOfMax<T extends number[], M = Max<T>, Idx extends any[] = []> = T extends [
313
+ infer F,
314
+ ...infer R extends number[]
315
+ ] ? F extends M ? Idx["length"] : IndexOfMax<R, M, [...Idx, any]> : never;
316
+
317
+ type Class = (new (...args: any[]) => any) | (abstract new (...args: any[]) => any);
318
+
319
+ type ChangeFieldType<Record, Name extends string, Type = any> = Expand<Omit<Record, Name> & {
320
+ [K in Name]: Type;
321
+ }>;
322
+
323
+ /**
324
+ * 从类型数组中移除重复项,返回保留唯一类型的元组
325
+ * @template T - 输入的任意类型数组(元组)
326
+ * @template Result - 内部使用的累积结果数组(默认空数组)
327
+ * @returns {any[]} 去重后的类型元组,保留首次出现的顺序
328
+ *
329
+ * @example
330
+ * type T1 = Unique<[number, string, number]>; // [number, string]
331
+ * type T2 = Unique<[1, 2, 2, 3]>; // [1, 2, 3]
332
+ * type T3 = Unique<['a', 'b', 'a']>; // ['a', 'b']
333
+ */
334
+ type Unique<T extends any[], Result extends any[] = []> = T extends [
335
+ infer First,
336
+ ...infer Rest
337
+ ] ? First extends Result[number] ? Unique<Rest, Result> : Unique<Rest, [...Result, First]> : Result;
338
+
339
+ type Overloads<T> = Unique<T extends {
340
+ (...args: infer A1): infer R1;
341
+ (...args: infer A2): infer R2;
342
+ (...args: infer A3): infer R3;
343
+ (...args: infer A4): infer R4;
344
+ (...args: infer A5): infer R5;
345
+ (...args: infer A6): infer R6;
346
+ (...args: infer A7): infer R7;
347
+ (...args: infer A8): infer R8;
348
+ } ? [
349
+ (...args: A1) => R1,
350
+ (...args: A2) => R2,
351
+ (...args: A3) => R3,
352
+ (...args: A4) => R4,
353
+ (...args: A5) => R5,
354
+ (...args: A6) => R6,
355
+ (...args: A7) => R7,
356
+ (...args: A8) => R8
357
+ ] : T extends {
358
+ (...args: infer A1): infer R1;
359
+ (...args: infer A2): infer R2;
360
+ (...args: infer A3): infer R3;
361
+ (...args: infer A4): infer R4;
362
+ (...args: infer A5): infer R5;
363
+ (...args: infer A6): infer R6;
364
+ (...args: infer A7): infer R7;
365
+ } ? [
366
+ (...args: A1) => R1,
367
+ (...args: A2) => R2,
368
+ (...args: A3) => R3,
369
+ (...args: A4) => R4,
370
+ (...args: A5) => R5,
371
+ (...args: A6) => R6,
372
+ (...args: A7) => R7
373
+ ] : T extends {
374
+ (...args: infer A1): infer R1;
375
+ (...args: infer A2): infer R2;
376
+ (...args: infer A3): infer R3;
377
+ (...args: infer A4): infer R4;
378
+ (...args: infer A5): infer R5;
379
+ (...args: infer A6): infer R6;
380
+ } ? [
381
+ (...args: A1) => R1,
382
+ (...args: A2) => R2,
383
+ (...args: A3) => R3,
384
+ (...args: A4) => R4,
385
+ (...args: A5) => R5,
386
+ (...args: A6) => R6
387
+ ] : T extends {
388
+ (...args: infer A1): infer R1;
389
+ (...args: infer A2): infer R2;
390
+ (...args: infer A3): infer R3;
391
+ (...args: infer A4): infer R4;
392
+ (...args: infer A5): infer R5;
393
+ } ? [
394
+ (...args: A1) => R1,
395
+ (...args: A2) => R2,
396
+ (...args: A3) => R3,
397
+ (...args: A4) => R4,
398
+ (...args: A5) => R5
399
+ ] : T extends {
400
+ (...args: infer A1): infer R1;
401
+ (...args: infer A2): infer R2;
402
+ (...args: infer A3): infer R3;
403
+ (...args: infer A4): infer R4;
404
+ } ? [
405
+ (...args: A1) => R1,
406
+ (...args: A2) => R2,
407
+ (...args: A3) => R3,
408
+ (...args: A4) => R4
409
+ ] : T extends {
410
+ (...args: infer A1): infer R1;
411
+ (...args: infer A2): infer R2;
412
+ (...args: infer A3): infer R3;
413
+ } ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3] : T extends {
414
+ (...args: infer A1): infer R1;
415
+ (...args: infer A2): infer R2;
416
+ } ? [(...args: A1) => R1, (...args: A2) => R2] : T extends {
417
+ (...args: infer A1): infer R1;
418
+ } ? [(...args: A1) => R1] : [T]>;
419
+
420
+ type OverrideOptions<T> = ChangeFieldType<Required<T>, "context", never>;
421
+
422
+ type Merge<T extends object, U extends object> = {
423
+ [K in keyof T | keyof U]: K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
424
+ };
425
+
426
+ /**
427
+ * 将联合类型合并为单个对象类型
428
+ * @description 将多个对象类型的联合类型合并成一个包含所有属性的对象类型
429
+ * @example
430
+ * type Result = MergeUnion<{ a: 1 } | { b: 2 }>;
431
+ * // Result = { a: 1; b: 2 }
432
+ */
23
433
  type MergeUnion<T> = (T extends any ? (x: T) => void : never) extends (x: infer U) => void ? {
24
434
  [K in keyof U]: U[K];
25
435
  } : never;
26
- type Split$1<S extends string, Delimiter extends string = '/'> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split$1<Tail, Delimiter>] : [S];
27
- type MatchSegment<Input extends string, Pattern extends string> = Pattern extends '*' ? true : Pattern extends '**' ? true : Input extends Pattern ? true : false;
28
- type MatchPatternArray<InputArr extends string[], PatternArr extends string[]> = InputArr extends [infer InputHead extends string, ...infer InputTail extends string[]] ? PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends '**' ? MatchPatternArray<InputTail, PatternTail> extends true ? true : MatchPatternArray<InputTail, PatternArr> extends true ? true : MatchPatternArray<InputArr, PatternTail> extends true ? true : false : MatchSegment<InputHead, PatternHead> extends true ? MatchPatternArray<InputTail, PatternTail> : false : false : PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends '**' ? MatchPatternArray<InputArr, PatternTail> : false : true;
29
- type MatchPattern<T extends string, Pattern extends string> = MatchPatternArray<Split$1<T>, Split$1<Pattern>> extends true ? {
30
- [K in Pattern]: any;
436
+
437
+ type DeepPartial<T> = {
438
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
439
+ };
440
+
441
+ type RequiredItems<T extends object, Items extends string[]> = Omit<T, Items[number]> & {
442
+ [K in Items[number] & keyof T]-?: Exclude<T[K], undefined>;
443
+ };
444
+
445
+ type Dict<V = any> = Record<Exclude<string, number | symbol>, V>;
446
+
447
+ type ValueOf<R extends Record<string, any>> = R[keyof R];
448
+
449
+ type OptionalKeys<T, K extends keyof T> = Expand<Omit<T, K> & {
450
+ [P in K]?: T[P];
451
+ }>;
452
+
453
+ type Tuple<T extends number, R extends unknown[] = []> = R["length"] extends T ? R : Tuple<T, [...R, unknown]>;
454
+
455
+ /**
456
+ * 确保字符串类型至少包含指定的字符串字面量
457
+ *
458
+ * 该类型工具保证结果类型包含 T1 中的所有字符串,同时可以包含 T2 中的其他字符串。
459
+ * 通过使用 `Omit<T2, T1>` 排除 T2 中已在 T1 存在的字符串,避免重复。
460
+ *
461
+ * @template T1 - 必须包含的字符串类型(字符串字面量或联合类型)
462
+ * @template T2 - 可选的字符串类型集合,默认为 `string`
463
+ *
464
+ * @example
465
+ * ```ts
466
+ * // 基础用法
467
+ * type Result1 = EnsureString<'a', 'a' | 'b' | 'c'>;
468
+ * // Result1: 'a' | 'b' | 'c'
469
+ *
470
+ * // 使用默认的 T2 参数
471
+ * type Result2 = EnsureString<'hello'>;
472
+ * // Result2: 'hello' | string(即 string)
473
+ *
474
+ * // 多个字符串字面量
475
+ * type Result3 = EnsureString<'a' | 'b', 'a' | 'b' | 'c' | 'd'>;
476
+ * // Result3: 'a' | 'b' | 'c' | 'd'
477
+ * ```
478
+ *
479
+ * @category Type Utils
480
+ */
481
+ type MergeStrings<T1 extends string, T2 extends string = string> = T1 | Omit<T2, T1>;
482
+
483
+ type IsMatchingOverload<Overloads extends any[], Args extends any[]> = Overloads extends [
484
+ infer First,
485
+ ...infer Rest
486
+ ] ? First extends (...args: any) => any ? Args extends Parameters<First> ? true : IsMatchingOverload<Rest, Args> : never : false;
487
+ type AllowCall<F extends (...args: any) => any, Args extends any[] = []> = Overloads<F> extends infer Overloads ? Overloads extends any[] ? IsMatchingOverload<Overloads, Args> extends true ? true : false : Args extends Parameters<F> ? true : false : never;
488
+
489
+ type StrictEqual<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
490
+
491
+ type IsAnyRecord<T> = StrictEqual<T, Record<string, any>>;
492
+
493
+ type RequiredKeys<T extends object, Keys extends keyof T> = Union<T & Required<Pick<T, Keys>>>;
494
+
495
+ type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S;
496
+ type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : [];
497
+ type ReplaceWildcard<T> = T extends string ? IsMultiWildcard<T> extends true ? T extends "**" ? `${string}/${string}` : T extends "*" ? string : T extends `${infer Head}/**` ? `${ReplaceWildcard<Head>}/${string}` : T : Join<ProcessSegments<Split<T>>> : T;
498
+
499
+ type WildcardKeys<T> = {
500
+ [K in keyof T]: K extends string ? (ContainsWildcard<K> extends true ? K : never) : never;
501
+ }[keyof T];
502
+
503
+ type ExpandWildcard<T extends Record<string, any>> = Expand<{
504
+ [K in WildcardKeys<T> as ReplaceWildcard<K>]: T[K];
505
+ } & {
506
+ [K in Exclude<keyof T, WildcardKeys<T>>]: T[K];
507
+ }>;
508
+
509
+ /**
510
+ * 判断单个路径段是否为通配符
511
+ *
512
+ * 示例:
513
+ * - IsWildcardSegment 星号 → true
514
+ * - IsWildcardSegment "rooms" → false
515
+ */
516
+ type IsWildcardPart<S extends string> = S extends "*" | "**" ? true : false;
517
+
518
+ /**
519
+ * CountWildcardSegments 的辅助实现
520
+ * 使用累加器模式计算通配符段数量
521
+ * @param Arr - 路径段数组
522
+ * @param Acc - 累加器(元组),长度即为当前计数
523
+ */
524
+ type CountWildcardSegmentsAcc<Arr extends string[], Acc extends any[]> = Arr extends [] ? Acc["length"] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? IsWildcardPart<First> extends true ? CountWildcardSegmentsAcc<Rest, [...Acc, any]> : CountWildcardSegmentsAcc<Rest, Acc> : Acc["length"];
525
+ /**
526
+ * 计算路径中通配符段的数量
527
+ *
528
+ * 通配符段是指完全等于星号或双星号的段
529
+ *
530
+ * @example
531
+ *
532
+ * GetWildcardCount<"*">
533
+ *
534
+ *
535
+ */
536
+ type GetWildcardCount<T extends string> = IsMultiWildcard<T> extends true ? 99 : CountWildcardSegmentsAcc<SplitPath<T>, []>;
537
+
538
+ type NormalEvents<T extends Record<string, any>> = {
539
+ [K in Exclude<keyof T, WildcardKeys<T>>]: T[K];
540
+ };
541
+
542
+ type IsSingleStar<T extends string> = T extends "*" ? true : false;
543
+ type WildcardKeyToObject<K extends string, V> = K extends K ? IsSingleStar<K> extends true ? {
544
+ [x: string]: V;
545
+ } : {
546
+ [P in ReplaceWildcard<K>]: V;
31
547
  } : never;
32
- type Fallback$1<T, F> = [T] extends [never] ? F : T extends undefined ? F : T;
548
+
549
+ type WildcardEvents<T extends Record<string, any>> = {
550
+ [K in WildcardKeys<T>]: ValueOf$1<WildcardKeyToObject<K, T[K]>>;
551
+ };
552
+
33
553
  /**
34
554
  *
35
- * 返回所有匹配事件的类型
555
+ * 输入原始事件类型定义
36
556
  *
37
- * 支持通配符
557
+ */
558
+ type GetWildcardEventList<Events extends Record<string, any>> = {
559
+ wildcard: WildcardEvents<Events>;
560
+ normal: NormalEvents<Events>;
561
+ };
562
+
563
+ /**
564
+ * 通配符优先级计算工具
38
565
  *
39
- * @param T 事件名称
40
- * @param Events 事件类型
41
- * @returns
566
+ * 用于区分通配符模式的具体程度,解决
567
+ * 核心规则:固定段多的优先级更高
568
+ */
569
+
570
+ /**
571
+ * CountFixedSegments 的辅助实现
572
+ * 使用累加器模式计算固定段数量
573
+ * @param Arr - 路径段数组
574
+ * @param Acc - 累加器(元组),长度即为当前计数
575
+ */
576
+ type CountFixedSegmentsAcc<Arr extends string[], Acc extends any[]> = Arr extends [] ? Acc["length"] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? IsWildcardPart<First> extends true ? CountFixedSegmentsAcc<Rest, Acc> : CountFixedSegmentsAcc<Rest, [...Acc, any]> : Acc["length"];
577
+ /**
578
+ * 计算路径中的固定段数量(非通配符的段)
579
+ * 使用累加器模式,通过元组长度来表示数字
580
+ */
581
+ type GetFixedPartCount<T extends string> = CountFixedSegmentsAcc<SplitPath<T>, []>;
582
+ type GetPartCountAcc<Arr extends string[], Acc extends any[]> = Arr extends [] ? Acc["length"] : Arr extends [infer _First extends string, ...infer Rest extends string[]] ? GetPartCountAcc<Rest, [...Acc, any]> : Acc["length"];
583
+
584
+ /**
585
+ * 检查是否为全通配符模式
586
+ *
587
+ * 全通配符定义:
588
+ * 只有完全没有任何固定段(即所有段都是通配符段)的模式才是全通配符
589
+ *
590
+ * 示例:
591
+ * - "*" → true(没有固定段)
592
+ * - "**" → true(没有固定段)
593
+ */
594
+ type IsFullWildcard<T extends string> = GetFixedPartCount<T> extends 0 ? GetWildcardCount<T> extends 0 ? false : true : false;
595
+
596
+ /**
597
+ * 判断是否为半通配符(既有固定段又有独立的通配符段)
42
598
  *
599
+ * 判断逻辑:
600
+ * 1. 使用 SplitPath 将路径分割成段数组(自动处理没有斜杠的情况)
601
+ * 2. 检查是否有固定段(非通配符段)且至少有一个独立的通配符段
602
+ * 3. 独立的通配符段是指完全等于星号或双星号的段
603
+ *
604
+ * 详细示例请参考测试文件 WildcardPriority.test.ts
43
605
  */
44
- type WildcardEvents<Events extends Record<string, any>, T extends string> = MergeUnion<Fallback$1<{
45
- [K in keyof Events]: MatchPattern<T, K & string> extends never ? never : {
46
- [P in K]: Events[K];
606
+ type IsSemiWildcard<T extends string> = GetFixedPartCount<T> extends 0 ? false : GetWildcardCount<T> extends 0 ? false : true;
607
+
608
+ type ToWildcardMessage<Events extends Record<string, any>, Meta = Record<string, any>> = {
609
+ [K in keyof Events]: {
610
+ type: ReplaceWildcard<Exclude<K, number | symbol>>;
611
+ payload: ValueOf$1<Events[K]>;
612
+ meta?: Meta;
47
613
  };
48
- }[keyof Events] extends infer Result ? Result extends Record<string, any> ? Result : Record<string, any> : Record<string, any>, {
49
- [K in T]: any;
614
+ }[keyof Events];
615
+
616
+ /**
617
+ * 将事件的所有应用通配符
618
+ *
619
+ * 将所有健中的通配符转换为${string}
620
+ *
621
+ */
622
+ type ApplyWildcardEvents<Events extends Record<string, any>> = {
623
+ [K in KeyOf<Events> as IsMultiWildcard<K> extends true ? `${string}/${string}` : ReplaceWildcard<K>]: Events[K];
624
+ };
625
+
626
+ /**
627
+ * 扩展通配符事件类型
628
+ * @description 将包含通配符的事件键扩展为模板字面量类型
629
+ *
630
+ * 优先级:非通配符键 > 单级通配符 > 多级通配符
631
+ * 使用交叉类型实现,确保精确键优先匹配
632
+ */
633
+ type ExtendWildcardEvents<Events extends Record<string, any>> = AssertRecord<RemoveEmptyObject<{
634
+ [K in keyof Events as K extends `${string}*${string}` | `*` ? never : K]: Events[K];
635
+ } & {
636
+ [K in keyof Events as K extends `${string}*${string}` | `*` ? ReplaceWildcard<K & string> : never]: Events[K];
50
637
  }>>;
638
+
51
639
  /**
52
- * 保留对象中第一项
640
+ * 计算输入的Key元组的优先级元组
641
+ *
642
+ * 用于匹配时使用
53
643
  */
54
- type FirstObjectItem<T extends Record<string, any>> = Pick<T, Keys<T> extends any[] ? Keys<T>[0] : never>;
55
- type isEmpty<T extends Record<string, any>> = keyof T extends never ? true : false;
56
- type GetWildcardItems<T extends Record<string, any>> = {
57
- [K in keyof T as K extends `${string}*${string}` ? K : K extends `*` ? K : never]: T[K];
644
+ type ToKeyPrioritys<T extends any[]> = {
645
+ [i in keyof T]: IsMultiWildcard<T[i]> extends true ? PrefixNumber<Subtract<10, GetPartCount<T[i]>>, 99> : GetWildcardCount<T[i]>;
58
646
  };
59
- type GetNotWildcardItems<T extends Record<string, any>> = {
60
- [K in keyof T as K extends `${string}*${string}` ? never : K extends `*` ? never : K]: T[K];
647
+
648
+ type ClosestMatch<T> = UnionToTuple$1<T>[IndexOfMin<ToKeyPrioritys<UnionToTuple$1<T>>>];
649
+
650
+ type GetPartCount<T extends string> = GetPartCountAcc<SplitPath<T>, []>;
651
+
652
+ type MatchSegment<Input extends string, Pattern extends string> = Pattern extends "*" ? true : Pattern extends "**" ? true : Input extends Pattern ? true : false;
653
+ type MatchPatternArray<InputArr extends string[], PatternArr extends string[]> = InputArr extends [
654
+ infer InputHead extends string,
655
+ ...infer InputTail extends string[]
656
+ ] ? PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends "**" ? MatchPatternArray<InputArr, PatternTail> extends true ? true : InputArr extends [infer _First, ...infer Rest extends string[]] ? MatchPatternArray<Rest, PatternTail> extends true ? true : MatchPatternArray<Rest, PatternArr> extends true ? true : false : false : MatchSegment<InputHead, PatternHead> extends true ? MatchPatternArray<InputTail, PatternTail> : false : false : PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends "**" ? PatternTail extends [] ? false : MatchPatternArray<InputArr, PatternTail> : false : true;
657
+ /**
658
+ * 判断输入路径是否匹配通配符模式
659
+ * @param Input 输入路径
660
+ * @param Pattern 通配符模式(支持 `*` 单级匹配和 `**` 末尾多级匹配)
661
+ * @returns 匹配返回 true,否则返回 false
662
+ *
663
+ * @example true
664
+ * IsWildcardMatched<"api/v1/users", "users/**"> // false
665
+ */
666
+ type IsWildcardMatched<Input extends string, Pattern extends string> = MatchPatternArray<Split<Input>, Split<Pattern>> extends true ? true : false;
667
+
668
+ /**
669
+ *
670
+ * 列出与T匹配的事件名称
671
+ *
672
+ * {<通配符数量>:<事件名称>}
673
+ *
674
+ type Events = {
675
+ "users/* /login": { userId: number };
676
+ "* /* /login": { userId: number };
677
+ "users/* /profile": { username: string };
678
+ };
679
+
680
+ type S2 = GetClosestEventNames<Events, "users/123/login">;
681
+ {
682
+ 1: "users/* /login";
683
+ 2: "* /* /login";
684
+ }
685
+ */
686
+ type GetMatchedEventNames<Events extends Record<string, any>, T extends string> = {
687
+ [Key in Exclude<keyof Events, number | symbol> as IsWildcardMatched<T, Key> extends true ? IsMultiWildcard<Key> extends true ? GetPartCount<Key> extends 9 ? 9 : GetPartCount<Key> extends 8 ? 8 : GetPartCount<Key> extends 7 ? 7 : GetPartCount<Key> extends 6 ? 6 : GetPartCount<Key> extends 5 ? 5 : GetPartCount<Key> extends 4 ? 4 : GetPartCount<Key> extends 3 ? 3 : GetPartCount<Key> extends 2 ? 2 : 1 : GetPartCount<Key> extends GetPartCount<T> ? GetWildcardCount<Key> extends 0 ? 0 : GetWildcardCount<Key> extends 1 ? 1 : GetWildcardCount<Key> extends 2 ? 2 : GetWildcardCount<Key> extends 3 ? 3 : GetWildcardCount<Key> extends 4 ? 4 : GetWildcardCount<Key> extends 5 ? 5 : GetWildcardCount<Key> extends 6 ? 6 : GetWildcardCount<Key> extends 7 ? 7 : GetWildcardCount<Key> extends 8 ? 8 : GetWildcardCount<Key> extends 9 ? 9 : never : never : T extends Key ? 0 : never]: Key;
61
688
  };
62
- type GetFirstMatchedItem<T extends Record<string, any>> = FirstObjectItem<isEmpty<GetNotWildcardItems<T>> extends true ? GetWildcardItems<T> : GetNotWildcardItems<T>>;
63
- type ClosestWildcardEvents<Events extends Record<string, any>, T extends string> = GetFirstMatchedItem<WildcardEvents<Events, T>>;
64
689
 
65
- type Split<S extends string, Delimiter extends string> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S];
66
- type MatchPatternAndGetRemainder<KeyParts extends string[], PrefixParts extends string[], Result extends string[] = []> = PrefixParts['length'] extends 0 ? KeyParts['length'] extends 0 ? never : KeyParts : KeyParts['length'] extends 0 ? never : KeyParts[0] extends PrefixParts[0] | '*' ? MatchPatternAndGetRemainder<Slice<KeyParts, 1>, Slice<PrefixParts, 1>, Result> : never;
67
- type Slice<T extends any[], Start extends number, Result extends any[] = []> = Start extends 0 ? T : T extends [infer First, ...infer Rest] ? Slice<Rest, Decrement<Start>, Result> : Result;
68
- type Decrement<N extends number> = N extends 0 ? 0 : N extends 1 ? 0 : N extends 2 ? 1 : N extends 3 ? 2 : N extends 4 ? 3 : N extends 5 ? 4 : N extends 6 ? 5 : N extends 7 ? 6 : N extends 8 ? 7 : N extends 9 ? 8 : number;
69
- type Join<T extends string[], Delimiter extends string = '/'> = T extends [infer First extends string, ...infer Rest extends string[]] ? Rest['length'] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : '';
70
- type ScopeEvents<Events extends Record<string, any>, Prefix extends string> = {
71
- [K in keyof Events as K extends string ? MatchPatternAndGetRemainder<Split<K, '/'>, Split<Prefix, '/'>> extends infer Remainder ? Remainder extends string[] ? Join<Remainder, '/'> : never : never : never]: Events[K];
690
+ /**
691
+ *
692
+ *
693
+ * 返回匹配T的所有Key的元素
694
+ *
695
+ * @example
696
+ *
697
+ *
698
+ */
699
+ type GetClosestEventNameTuple<Events extends Record<string, any>, T extends string> = (GetMatchedEventNames<Events, T> extends {
700
+ 0: infer V;
701
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
702
+ 1: infer V;
703
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
704
+ 2: infer V;
705
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
706
+ 3: infer V;
707
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
708
+ 4: infer V;
709
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
710
+ 5: infer V;
711
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
712
+ 6: infer V;
713
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
714
+ 7: infer V;
715
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
716
+ 8: infer V;
717
+ } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends {
718
+ 9: infer V;
719
+ } ? V extends never ? never : V : never);
720
+
721
+ /**
722
+ * 返回最接近的Key
723
+ */
724
+ type GetClosestEventName<Events extends Record<string, any>, T extends string> = GetMatchedEventNames<Events, T> extends never ? never : ClosestMatch<GetClosestEventNameTuple<Events, T>>;
725
+
726
+ /**
727
+
728
+ type Events = {
729
+ "users/* /login": { userId: number };
730
+ "* /* /login": { userId: number };
731
+ "users/* /profile": { username: string };
732
+ };
733
+
734
+ type Result1 = GetClosestEvents<Events, "users/123/login">;
735
+
736
+ {
737
+ "users/* /login": {
738
+ userId: number;
739
+ };
740
+ }
741
+ */
742
+ type GetClosestEvents<Events extends Record<string, any>, T extends string, D = Record<string, any>> = GetClosestEventName<Events, T> extends never ? D : Record<AssertString<GetClosestEventName<Events, T>>, Events[AssertString<GetClosestEventName<Events, T>>]>;
743
+
744
+ /**
745
+ * 返回最匹配的事件元组
746
+ *
747
+ * [事件名称,事件负载]
748
+ *
749
+ * type Events = {
750
+ * "users/* /login": string;
751
+ "users/* /logout": number;
752
+ "users/* /*": { name: string };
753
+ };
754
+
755
+ type Result =GetClosestEventTuple<Events,"users/fisher/login">
756
+ type Result = ["users/* /login", string]
757
+
758
+ *
759
+ */
760
+ type GetClosestEventTuple<Events extends Record<string, any>, T extends string> = ExpandRecord<GetClosestEvents<Events, T>>;
761
+
762
+ type ToFixedCounts<T extends any[]> = {
763
+ [i in keyof T]: GetPartCount<T[i]>;
72
764
  };
73
765
 
766
+ /**
767
+ * 判断事件名 T 是否匹配模式 P
768
+ *
769
+ * 匹配规则:
770
+ * - 精确匹配:T 完全等于 P(当 P 不包含通配符时)
771
+ * - 单级通配符 *:匹配任意单段路径
772
+ * - 多级通配符 **:匹配零或多段路径
773
+ * - 支持联合类型:P 可以是多个模式的联合,如 "a" | "b"
774
+ *
775
+ * @example
776
+ * - IsMatchEventName<"user/login", "user/login"> = true
777
+ * - IsMatchEventName<"user/login", "user&#47;*"> = true (末尾单级通配符)
778
+ * - IsMatchEventName<"user/login", "*&#47;login"> = true (开头单级通配符)
779
+ * - IsMatchEventName<"user/profile/edit", "user&#47;**"> = true (末尾多级通配符)
780
+ * - IsMatchEventName<"a/b/c", "**"> = true (全通配符)
781
+ * - IsMatchEventName<"user/login", "user/login" | "admin/*"> = true (联合类型)
782
+ */
783
+ type MatchSingleStar<T extends string[], P extends string[]> = T extends [] ? P extends [] ? true : false : P extends [] ? false : T extends [infer TFirst extends string, ...infer TRest extends string[]] ? P extends [infer PFirst extends string, ...infer PRest extends string[]] ? PFirst extends "*" ? MatchSingleStar<TRest, PRest> : TFirst extends PFirst ? MatchSingleStar<TRest, PRest> : false : false : false;
784
+ type MatchWithDoubleStar<T extends string[], P extends string[]> = T extends [] ? P extends [] ? true : false : P extends [] ? false : T extends [infer TFirst extends string, ...infer TRest extends string[]] ? P extends [infer PFirst extends string, ...infer PRest extends string[]] ? PFirst extends "*" ? MatchWithDoubleStar<TRest, PRest> : PFirst extends "**" ? MatchDoubleStar<T, PRest> : TFirst extends PFirst ? MatchWithDoubleStar<TRest, PRest> : false : false : false;
785
+ type MatchDoubleStar<T extends string[], P extends string[]> = T extends [] ? P extends [] ? true : false : P extends [] ? true : T extends [infer _TFirst extends string, ...infer TRest extends string[]] ? P extends ["**"] ? MatchDoubleStar<TRest, P> : P extends [infer PFirst extends string, ...infer PRest extends string[]] ? PFirst extends "*" ? MatchWithDoubleStar<TRest, PRest> : PFirst extends "**" ? MatchDoubleStar<T, PRest> : T extends [infer TFirst extends string, ...infer TRest2 extends string[]] ? TFirst extends PFirst ? MatchWithDoubleStar<TRest2, PRest> : MatchDoubleStar<TRest, P> : false : false : false;
786
+ type IsMatchEventNameImpl<T extends string, P> = P extends string ? ContainsWildcard<P> extends false ? T extends P ? true : false : IsMultiWildcard<P> extends true ? MatchWithDoubleStar<SplitPath<T>, SplitPath<P>> : MatchSingleStar<SplitPath<T>, SplitPath<P>> : false;
787
+ type IsMatchEventNameDistributed<T extends string, P> = P extends any ? IsMatchEventNameImpl<T, P> : never;
788
+ type IsMatchEventName<T extends string, P> = true extends IsMatchEventNameDistributed<T, P> ? true : false;
789
+
790
+ /**
791
+ *
792
+ * - 当K不包括通配符时,直接返回K
793
+ * - 当包括通配符时,返回K | Omit<ReplaceWildcard<K>, K>
794
+ * 这样操作的目的是为了能让IDE提供"users/* /login"并且能适配通配符
795
+ * 如果不这样操作,IDE不会提示
796
+ *
797
+ *
798
+ *
799
+ */
800
+ type EnsureEventType<K extends string> = ContainsWildcard<K> extends true ? K | ReplaceWildcard<K> : K;
801
+ type MutableMessage<Events extends Record<string, any>, Meta extends Record<string, any> = Record<string, any>> = IsAnyRecord<Events> extends true ? OptionalKeys<FastEventMessage<string, any, Meta>, "meta"> & FastEventMessageExtends : {
802
+ [K in KeyOf<Events>]: Events[K] extends FastMessagePayload ? IfNever<Events[K]["type"], any> : {
803
+ type: ReplaceWildcard<K extends "*" ? string : EnsureEventType<K>>;
804
+ payload: IfNever<Events[K], any>;
805
+ meta?: Meta;
806
+ } & FastEventMessageExtends;
807
+ }[KeyOf<Events>];
808
+
809
+ /**
810
+ * 事件消息相关
811
+ */
812
+
74
813
  interface FastEventMeta {
75
814
  }
76
815
  interface FastEventMessageExtends {
77
816
  }
78
- type FastEventMessage<P = any, M extends Record<string, any> = Record<string, any>, T extends string = string> = {
817
+ type FastEventMessage<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = {
79
818
  type: T;
80
819
  payload: P;
81
- meta?: M & Partial<FastEventMeta>;
820
+ meta?: FastEventMeta & M & Record<string, any>;
82
821
  } & FastEventMessageExtends;
83
- type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
84
- [K in keyof Events]: {
822
+ /**
823
+ * 用于emit方法,允许meta可选,更加宽泛
824
+ */
825
+ type FastEventEmitMessage<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = OptionalKeys<FastEventMessage<T, P, M>, "meta">;
826
+ type WildcardStyle = `*` | `**` | `${string}/*` | `*/${string}` | `${string}/*/${string}` | `${string}/**`;
827
+ type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
828
+ [K in keyof Events as K extends WildcardStyle ? ReplaceWildcard<K> : never]: {
829
+ type: ReplaceWildcard<K>;
830
+ payload: Events[K];
831
+ meta?: Partial<FastEventMeta & M> & Record<string, any>;
832
+ };
833
+ } & {
834
+ [K in keyof Events as K extends WildcardStyle ? never : K]: {
85
835
  type: Exclude<K, number | symbol>;
86
836
  payload: Events[K];
87
- meta: FastEventMeta & M & Record<string, any>;
837
+ meta?: Partial<FastEventMeta> & M & Record<string, any>;
88
838
  };
89
- }[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
839
+ })[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
90
840
  type TypedFastEventMessageOptional<Events extends Record<string, any> = Record<string, any>, M = any> = {
91
841
  [K in keyof Events]: {
92
842
  type: Exclude<K, number | symbol>;
@@ -94,40 +844,118 @@ type TypedFastEventMessageOptional<Events extends Record<string, any> = Record<s
94
844
  meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
95
845
  };
96
846
  }[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
97
- type FastEventEmitMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
847
+ type FastMessagePayload<P = any> = {
848
+ type: P;
849
+ __IS_FAST_MESSAGE__: true;
850
+ };
851
+ /**
852
+ * 通用事件消息类型
853
+ * @description 根据 Events 类型生成联合类型,每个成员包含 type 和 payload 字段
854
+ *
855
+ * @example
856
+ * type Events = {
857
+ * userCreated: { id: number; name: string };
858
+ * userDeleted: number;
859
+ * statusChanged: 'active' | 'inactive';
860
+ * };
861
+ *
862
+ * type Message = FastEventCommonMessage<Events>;
863
+ * // 等价于:
864
+ * // type Message = {
865
+ * // type: 'userCreated';
866
+ * // payload: { id: number; name: string };
867
+ * // } | {
868
+ * // type: 'userDeleted';
869
+ * // payload: number;
870
+ * // } | {
871
+ * // type: 'statusChanged';
872
+ * // payload: 'active' | 'inactive';
873
+ * // }
874
+ */
875
+ type FastEventCommonMessage<Events extends Record<string, any>> = {
98
876
  [K in keyof Events]: {
99
877
  type: Exclude<K, number | symbol>;
100
- payload?: Events[K];
101
- meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
878
+ payload: Events[K];
102
879
  };
103
- }[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
104
- type FastMessagePayload<P = any> = {
105
- type: P;
880
+ }[Exclude<keyof Events, number | symbol>];
881
+ /**
882
+ * 声明事件类型时,一般情况下,K=事件名称,V=事件Payload参数类型
883
+ *
884
+ * AssertFastMessage用于声明V是一个FastMessage类型,而不是Payload类型
885
+ *
886
+ * 一般配合transform参数使用
887
+ *
888
+ * 例如:
889
+ * type CustomEvents = {
890
+ click: NotPayload<{ x: number; y: number }>;
891
+ <事件名称,即type>:<事件负载,即payload>
892
+ }
893
+ 常规情况下,事件的K=事件名称,V=事件Payload参数类型
894
+
895
+ 但是如我们使用了transform对事件进行了转换时,此时接收到的消息可能就不是标准事件消息{type,payload}
896
+
897
+ 此时可以使用NotPayload或AssertFastMessage类型声明
898
+
899
+ const emitter = new FastEvent<CustomEvents>();
900
+ emitter.on('click', (message) => {
901
+ // 因为上面的click事件中使用了NotPayload类型
902
+ // typeof message === { x: number; y: number }
903
+ })
904
+ const emitter = new FastEvent<CustomEvents>({
905
+ transform:(message)=>{
906
+ if(message.type === 'click'){
907
+ return message.payload
908
+ }else{
909
+ return message
910
+ }
911
+ }
912
+ });
913
+ emitter.on('click', (message) => {
914
+ // typeof message === { x: number; y: number }
915
+ }
916
+ */
917
+ type AssertFastMessage<M> = {
918
+ type: M;
106
919
  __IS_FAST_MESSAGE__: true;
107
920
  };
108
- type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
109
- type TypedFastEventAnyListener<Events extends Record<string, any> = Record<string, any>, Meta = never, Context = any> = (this: Context, message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
110
- type FastEventListeners<Events extends Record<string, any> = Record<string, any>, M = any, C = any> = {
111
- [K in keyof Events]: TypedFastEventListener<Exclude<K, number | symbol>, Events[K], M, C>;
112
- };
113
- type FastEventListener<P = any, M extends Record<string, any> = Record<string, any>, T extends string = string> = (message: FastEventMessage<P, M, T>, args: FastEventListenerArgs<M>) => any | Promise<any>;
921
+
114
922
  /**
115
- * [
116
- * 监听器函数引用,
117
- * 需要执行多少次, =0代表不限
118
- * 实际执行的次数(用于负载均衡时记录)
119
- * 标签 用于调试一般可以标识监听器类型或任意信息
120
- * 标识
121
- * ]
923
+ * FastEvent 订阅者类型
924
+ *
925
+ * @description
926
+ * 当使用 { iterable: true } 选项时,返回的订阅者对象支持异步迭代,
927
+ * 可以使用 for await...of 语法消费事件消息。
928
+ *
929
+ * @example
930
+ * ```ts
931
+ * // 普通订阅者(不启用 iterable)
932
+ * const subscriber1 = emitter.on('event', listener);
933
+ * subscriber1.off();
934
+ *
935
+ * // 可迭代订阅者(启用 iterable)
936
+ * const subscriber2 = emitter.on('event', null, { iterable: true });
937
+ * for await (const message of subscriber2) {
938
+ * console.log(message);
939
+ * }
940
+ * ```
122
941
  */
123
- type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string, number];
124
- type FastListenerNode = {
125
- __listeners: FastListenerMeta[];
126
- } & {
127
- [key: string]: FastListenerNode;
128
- };
129
942
  type FastEventSubscriber = {
943
+ /**
944
+ * 取消订阅
945
+ */
130
946
  off: () => void;
947
+ /**
948
+ * 同步资源释放(支持 using 语句)
949
+ *
950
+ * @example
951
+ * ```ts
952
+ * {
953
+ * using subscriber = emitter.on('event', listener);
954
+ * // subscriber 在作用域结束时自动释放
955
+ * }
956
+ * ```
957
+ */
958
+ [Symbol.dispose]: () => void;
131
959
  /**
132
960
  * 为什么要有一个listener引用? 主要用于移除监听器时使用
133
961
  *
@@ -156,9 +984,122 @@ type FastEventSubscriber = {
156
984
  * scope.off(subscriber.listener) // 生效
157
985
  *
158
986
  */
159
- listener: TypedFastEventListener<any, any, any>;
987
+ readonly listener: TypedFastEventListener<any, any, any>;
988
+ } & {
989
+ /**
990
+ * 将消息加入队列(内部方法,仅当启用 iterable 时可用)
991
+ * @internal
992
+ */
993
+ _enqueue?: (message: TypedFastEventMessage) => void;
994
+ /**
995
+ * 关闭订阅者(内部方法,仅当启用 iterable 时可用)
996
+ * @internal
997
+ */
998
+ _close?: () => void;
160
999
  };
161
- type FastListeners = FastListenerNode;
1000
+
1001
+ type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
1002
+
1003
+ type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener;
1004
+
1005
+ /**
1006
+ * FastEventIterator - 使用异步迭代器从 FastEvent 或 FastEventScope 订阅事件
1007
+ * 重构:使用 queue.ts 中的队列参数和逻辑
1008
+ */
1009
+
1010
+ type FastQueueOverflows = "drop" | "expand" | "slide" | "throw";
1011
+ interface FastEventIteratorOptions<T = FastEventMessage> {
1012
+ /** 缓冲区默认大小(默认:100) */
1013
+ size?: number;
1014
+ /** 缓冲区扩展到多大时不再扩展(默认:1000) */
1015
+ maxExpandSize?: number;
1016
+ /** 当扩展到最大大小后的溢出策略(默认:'slide') */
1017
+ expandOverflow?: Omit<FastQueueOverflows, "expand">;
1018
+ /** 溢出策略(默认:'slide') */
1019
+ overflow?: FastQueueOverflows;
1020
+ /** 消息生命周期(毫秒),0表示不启用(默认:0) */
1021
+ lifetime?: number;
1022
+ /** 当新消息到达时触发此回调 */
1023
+ onPush?: (newMessage: T, messages: [T, number][]) => void;
1024
+ /** 当消息被弹出时触发此回调,可以在此对消息队列进行排序等操作 */
1025
+ onPop?: (messages: [T, number][], hasNew: boolean) => [T, number] | undefined;
1026
+ /** 当消息被丢弃时触发此回调 */
1027
+ onDrop?: (message: T) => void;
1028
+ /** 错误处理函数,返回true表示继续迭代,false表示停止迭代 */
1029
+ onError?: (error: Error) => boolean | Promise<boolean>;
1030
+ /** 信号,用于取消迭代 */
1031
+ signal?: AbortSignal;
1032
+ }
1033
+ declare class FastEventIterator<T = any> implements AsyncIterableIterator<T> {
1034
+ private eventEmitter;
1035
+ private eventName;
1036
+ private buffer;
1037
+ private resolvers;
1038
+ private errorResolvers;
1039
+ private isStopped;
1040
+ private error;
1041
+ private options;
1042
+ private currentSize;
1043
+ private hasNewMessage;
1044
+ private _listener;
1045
+ private _ready;
1046
+ private _listenOptions?;
1047
+ private _cleanups;
1048
+ constructor(eventEmitter: FastEvent<any> | FastEventScope<any, any, any>, eventName: string, options?: FastEventIteratorOptions<T>);
1049
+ get listener(): FastEventListener;
1050
+ get ready(): boolean;
1051
+ /**
1052
+ * 创建异步迭代器
1053
+ */
1054
+ create(options?: FastEventListenOptions): void;
1055
+ /**
1056
+ * 推送消息到缓冲区
1057
+ */
1058
+ private push;
1059
+ /**
1060
+ * 处理缓冲区溢出
1061
+ * @returns 返回 true 表示消息已添加,false 表示消息被丢弃
1062
+ */
1063
+ private handleOverflow;
1064
+ private onMessage;
1065
+ /**
1066
+ * 中止监听
1067
+ * @param abort
1068
+ * @returns
1069
+ */
1070
+ off(abort?: boolean): void;
1071
+ next(): Promise<IteratorResult<T>>;
1072
+ [Symbol.asyncIterator](): AsyncIterableIterator<T>;
1073
+ done(): Promise<IteratorResult<T>>;
1074
+ throw(error?: any): Promise<IteratorResult<T>>;
1075
+ /**
1076
+ * 当 for await...of 循环被 break、return 或 throw 中断时调用
1077
+ * 自动清理资源,防止内存泄漏
1078
+ */
1079
+ return(): Promise<IteratorResult<T>>;
1080
+ /**
1081
+ * 同步资源释放(支持 using 语句)
1082
+ *
1083
+ * @description
1084
+ * 当使用 `using` 语句时,此方法会在作用域结束时自动调用,
1085
+ * 执行 off() 方法取消订阅。
1086
+ *
1087
+ * @example
1088
+ * ```ts
1089
+ * {
1090
+ * using subscriber = emitter.on('event');
1091
+ * // subscriber 在作用域结束时自动调用 off()
1092
+ * }
1093
+ * ```
1094
+ */
1095
+ [Symbol.dispose](): void;
1096
+ on(): void;
1097
+ }
1098
+
1099
+ /**
1100
+ * 事件相关
1101
+ */
1102
+
162
1103
  type FastEventOptions<Meta = Record<string, any>, Context = never> = {
163
1104
  id: string;
164
1105
  debug: boolean;
@@ -171,12 +1112,14 @@ type FastEventOptions<Meta = Record<string, any>, Context = never> = {
171
1112
  onClearListeners?: () => void;
172
1113
  onListenerError?: (error: Error, listener: TypedFastEventListener, message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void;
173
1114
  onBeforeExecuteListener?: (message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void | any[];
174
- onAfterExecuteListener?: (message: TypedFastEventMessage<any, Meta>, returns: any[], listeners: FastListenerNode[]) => void;
1115
+ onAfterExecuteListener?: (message: TypedFastEventMessage<any, Meta>, returns: any[], listeners: FastEventListenerNode[]) => void;
175
1116
  /**
176
1117
  * 全局执行器
177
1118
  */
178
1119
  executor?: FastListenerExecutor;
179
- onMessage?: TypedFastEventListener;
1120
+ /**
1121
+ * 是否展开emit返回值,默认为false,用于将事件转发给其他FastEvent时使用
1122
+ */
180
1123
  expandEmitResults?: boolean;
181
1124
  /**
182
1125
  * 对接收到的消息进行转换,用于将消息转换成其他格式
@@ -204,6 +1147,19 @@ type FastEventListenOptions<Events extends Record<string, any> = Record<string,
204
1147
  * emitter.getListeners(tag)
205
1148
  */
206
1149
  tag?: string;
1150
+ /**
1151
+ * 异步迭代器选项
1152
+ *
1153
+ * 用于配置返回异步迭代器的参数
1154
+ *
1155
+ * 默认值是
1156
+ {
1157
+ overflow: "expand",
1158
+ size: 10,
1159
+ maxExpandSize: 100,
1160
+ }
1161
+ */
1162
+ iterable?: FastEventIteratorOptions;
207
1163
  };
208
1164
  declare enum FastEventListenerFlags {
209
1165
  Transformed = 1
@@ -236,145 +1192,115 @@ type FastEventListenerArgs<M = Record<string, any>> = {
236
1192
  */
237
1193
  rawEventType?: string;
238
1194
  };
239
- type Merge<T extends object, U extends object> = {
240
- [K in keyof T | keyof U]: K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
241
- };
242
- type RequiredItems<T extends object, Items extends string[]> = Omit<T, Items[number]> & {
243
- [K in Items[number] & keyof T]-?: Exclude<T[K], undefined>;
244
- };
245
- type Expand<T> = T extends infer O ? {
246
- [K in keyof O]: O[K];
247
- } : never;
248
- type OptionalItems<T, K extends keyof T> = Expand<Omit<T, K> & {
249
- [P in K]?: T[P];
250
- }>;
251
- type DeepPartial<T> = {
252
- [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
1195
+
1196
+ type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
1197
+ type TypedFastEventAnyListener<Events extends Record<string, any> = Record<string, any>, Meta = never, Context = any> = (this: Context, message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
1198
+ type FastEventListeners<Events extends Record<string, any> = Record<string, any>, M = any, C = any> = {
1199
+ [K in keyof Events]: TypedFastEventListener<Exclude<K, number | symbol>, Events[K], M, C>;
253
1200
  };
254
- type Fallback<T, F> = [T] extends [never] ? F : T extends undefined ? F : T;
255
- type ChangeFieldType<Record, Name extends string, Type = any> = Expand<Omit<Record, Name> & {
256
- [K in Name]: Type;
257
- }>;
258
- type OverrideOptions<T> = ChangeFieldType<Required<T>, 'context', never>;
259
- type ObjectKeys<T, I = string> = {
260
- [P in keyof T]: P extends I ? P : never;
261
- }[keyof T];
1201
+ type FastEventListener<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = (message: FastEventMessage<T, P, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
1202
+ type FastEventCommonListener<Message = FastEventMessage, Meta extends Record<string, any> = Record<string, any>, Context = any> = (this: Context, message: Message, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
262
1203
  /**
263
- * 从类型数组中移除重复项,返回保留唯一类型的元组
264
- * @template T - 输入的任意类型数组(元组)
265
- * @template Result - 内部使用的累积结果数组(默认空数组)
266
- * @returns {any[]} 去重后的类型元组,保留首次出现的顺序
267
- *
268
- * @example
269
- * type T1 = Unique<[number, string, number]>; // [number, string]
270
- * type T2 = Unique<[1, 2, 2, 3]>; // [1, 2, 3]
271
- * type T3 = Unique<['a', 'b', 'a']>; // ['a', 'b']
1204
+ * [
1205
+ * 监听器函数引用,
1206
+ * 需要执行多少次, =0代表不限
1207
+ * 实际执行的次数(用于负载均衡时记录)
1208
+ * 标签 用于调试一般可以标识监听器类型或任意信息
1209
+ * 标识
1210
+ * ]
272
1211
  */
273
- type Unique<T extends any[], Result extends any[] = []> = T extends [infer First, ...infer Rest] ? First extends Result[number] ? Unique<Rest, Result> : Unique<Rest, [...Result, First]> : Result;
274
- type Overloads<T> = Unique<T extends {
275
- (...args: infer A1): infer R1;
276
- (...args: infer A2): infer R2;
277
- (...args: infer A3): infer R3;
278
- (...args: infer A4): infer R4;
279
- (...args: infer A5): infer R5;
280
- (...args: infer A6): infer R6;
281
- (...args: infer A7): infer R7;
282
- (...args: infer A8): infer R8;
283
- } ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6, (...args: A7) => R7, (...args: A8) => R8] : T extends {
284
- (...args: infer A1): infer R1;
285
- (...args: infer A2): infer R2;
286
- (...args: infer A3): infer R3;
287
- (...args: infer A4): infer R4;
288
- (...args: infer A5): infer R5;
289
- (...args: infer A6): infer R6;
290
- (...args: infer A7): infer R7;
291
- } ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6, (...args: A7) => R7] : T extends {
292
- (...args: infer A1): infer R1;
293
- (...args: infer A2): infer R2;
294
- (...args: infer A3): infer R3;
295
- (...args: infer A4): infer R4;
296
- (...args: infer A5): infer R5;
297
- (...args: infer A6): infer R6;
298
- } ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6] : T extends {
299
- (...args: infer A1): infer R1;
300
- (...args: infer A2): infer R2;
301
- (...args: infer A3): infer R3;
302
- (...args: infer A4): infer R4;
303
- (...args: infer A5): infer R5;
304
- } ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5] : T extends {
305
- (...args: infer A1): infer R1;
306
- (...args: infer A2): infer R2;
307
- (...args: infer A3): infer R3;
308
- (...args: infer A4): infer R4;
309
- } ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4] : T extends {
310
- (...args: infer A1): infer R1;
311
- (...args: infer A2): infer R2;
312
- (...args: infer A3): infer R3;
313
- } ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3] : T extends {
314
- (...args: infer A1): infer R1;
315
- (...args: infer A2): infer R2;
316
- } ? [(...args: A1) => R1, (...args: A2) => R2] : T extends {
317
- (...args: infer A1): infer R1;
318
- } ? [(...args: A1) => R1] : [T]>;
319
- type Dict<V = any> = Record<Exclude<string, number | symbol>, V>;
320
- type RecordValues<R extends Record<string, any>> = R[keyof R];
321
- type RecordPrefix<P extends string, R extends Record<string, any>> = {
322
- [K in keyof R as K extends `${P}/${infer S}` ? S : never]: R[K];
1212
+ type FastEventListenerMeta = [
1213
+ TypedFastEventListener<any, any>,
1214
+ number,
1215
+ number,
1216
+ string,
1217
+ number
1218
+ ];
1219
+ type FastEventListenerNode = {
1220
+ __listeners: FastEventListenerMeta[];
1221
+ } & {
1222
+ [key: string]: FastEventListenerNode;
323
1223
  };
1224
+ type FastListeners = FastEventListenerNode;
1225
+
324
1226
  /**
325
- * 声明事件类型时,一般情况下,K=事件名称,V=事件Payload参数类型
326
- *
327
- * AssertFastMessage用于声明V是一个FastMessage类型,而不是Payload类型
328
- *
329
- * 一般配合transform参数使用
1227
+ * 获取指定事件名称的负载类型
1228
+ */
1229
+ type GetPayload<Events extends Record<string, any>, T> = T extends string ? GetClosestEventTuple<Events, T>[1] : any;
1230
+
1231
+ /**
1232
+ * 检查事件对象的所有值是否都为 FastMessagePayload 类型
1233
+ * @description
1234
+ * - 如果 Events 为空对象,返回 false
1235
+ * - 如果所有值都 extends FastMessagePayload,返回 true
1236
+ * - 否则返回 false
330
1237
  *
331
- * 例如:
332
- * type CustomEvents = {
333
- click: { x: number; y: number };
334
- }
335
- const emitter = new FastEvent<CustomEvents>();
336
- emitter.on('click', (message) => {
337
- // typeof message.payload === { x: number; y: number }
338
- })
339
- const emitter = new FastEvent<CustomEvents>({
340
- transform:(message)=>{
341
- if(message.type === 'click'){
342
- return message.payload
343
- }else{
344
- return message
345
- }
346
- }
347
- });
348
- emitter.on('click', (message) => {
349
- // typeof message === { x: number; y: number }
350
- }
1238
+ * @example
1239
+ * type Test1 = IsTransformed<{ a: FastMessagePayload<string> }>; // true
1240
+ * type Test2 = IsTransformed<{ a: FastMessagePayload<string>; b: number }>; // false
1241
+ * type Test3 = IsTransformed<{}>; // false
351
1242
  */
352
- type AssertFastMessage<M> = {
353
- type: M;
354
- __IS_FAST_MESSAGE__: true;
355
- };
356
- type NotPayload<M> = AssertFastMessage<M>;
357
- type PickPayload<M> = M extends FastMessagePayload ? M['type'] : M;
358
- type AtPayloads<Events extends Record<string, any>> = {
359
- [K in keyof Events]: PickPayload<Events[K]>;
360
- };
361
- type PickTransformedEvents<T extends Record<string, any>> = ExpandWildcard<{
362
- [key in keyof T as T[key] extends FastMessagePayload ? key : never]: T[key];
363
- }>;
1243
+ type IsAllTransformed<Events extends Record<string, any>> = keyof Events extends never ? false : {
1244
+ [K in keyof Events]: Events[K] extends FastMessagePayload<any> ? true : false;
1245
+ }[keyof Events] extends infer Result ? [Result] extends [true] ? true : false : false;
1246
+
1247
+ type GetClosestEventPayload<Events extends Record<string, any>, T extends string> = GetClosestEventTuple<Events, T>[1];
1248
+
1249
+ type IsTransformedEvent<Events extends Record<string, any>, T extends string> = T extends keyof Events ? IsAny<Events[T]> extends true ? never : Events[T] extends FastMessagePayload<any> ? T : never : IsAny<GetClosestEventPayload<Events, T>> extends true ? never : GetClosestEventPayload<Events, T> extends FastMessagePayload<any> ? T : never;
1250
+
1251
+ type NotPayload<M> = IsAny<M> extends true ? FastMessagePayload<any> : [M] extends [FastMessagePayload] ? M : FastMessagePayload<M>;
1252
+
364
1253
  type OmitTransformedEvents<T extends Record<string, any>> = {
365
1254
  [key in keyof T as T[key] extends FastMessagePayload ? never : key]: T[key];
366
1255
  };
1256
+
1257
+ type PayloadValues<R extends Record<string, any>> = R[keyof R] extends FastMessagePayload<infer P> ? P : R[keyof R];
1258
+
1259
+ type PickPayload<M> = [M] extends [FastMessagePayload] ? M["type"] : M;
1260
+
1261
+ type PickTransformedEvents<T extends Record<string, any>> = ExpandWildcard<{
1262
+ [key in keyof T as T[key] extends FastMessagePayload<any> ? key : never]: T[key];
1263
+ }>;
1264
+
367
1265
  type TransformedEvents<Events extends Record<string, any>> = {
368
1266
  [K in keyof Events]: NotPayload<Events[K]>;
369
1267
  };
370
1268
 
371
- type Class = (new (...args: any[]) => any) | (abstract new (...args: any[]) => any);
1269
+ type AtPayloads<Events extends Record<string, any>> = {
1270
+ [K in keyof Events]: PickPayload<Events[K]>;
1271
+ };
1272
+
1273
+ /**
1274
+ * 将对象中值是FastMessagePayload的类型提取出来
1275
+ */
1276
+ type UnTransformedEvents<Events extends Record<string, any>> = {
1277
+ [K in keyof Events]: Events[K] extends FastMessagePayload<infer P> ? P : Events[K];
1278
+ };
1279
+
1280
+ /**
1281
+ * 返回最匹配的事件元组
1282
+ *
1283
+ * [事件名称,事件负载]
1284
+ *
1285
+ * type Events = {
1286
+ * "users/* /login": string;
1287
+ "users/* /logout": number;
1288
+ "users/* /*": { name: string };
1289
+ };
1290
+
1291
+ type Result =GetClosestEventTuple<Events,"users/fisher/login">
1292
+ type Result = ["users/* /login", string]
1293
+
1294
+ *
1295
+ */
1296
+ type GetClosestMessage<Events extends Record<string, any>, T extends string, Meta extends Record<string, any> = never> = FastEventMessage<ContainsWildcard<T> extends true ? ReplaceWildcard<Exclude<ExpandRecord<GetClosestEvents<Events, T>>[0], number | symbol>> : T, ExpandRecord<GetClosestEvents<Events, T>>[1], Meta>;
1297
+
1298
+ type InMatchedEvent<Events extends Record<string, any>, T> = T extends KeyOf<Events> | ReplaceWildcard<KeyOf<Events>> ? true : false;
372
1299
 
373
1300
  type FastEventScopeOptions<Meta = Record<string, any>, Context = never> = {
374
1301
  meta: FastEventScopeMeta & FastEventMeta & Meta;
375
1302
  context: Context;
376
1303
  executor?: FastListenerExecutor;
377
- onMessage?: TypedFastEventListener;
378
1304
  /**
379
1305
  * 对接收到的消息进行转换,用于将消息转换成其他格式
380
1306
  *
@@ -389,16 +1315,24 @@ type FastEventScopeOptions<Meta = Record<string, any>, Context = never> = {
389
1315
  interface FastEventScopeMeta {
390
1316
  scope: string;
391
1317
  }
1318
+ interface IFastEventScope<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never> {
1319
+ __FastEventScope__: boolean;
1320
+ readonly __events__: Events;
1321
+ readonly __meta__: Meta;
1322
+ readonly __context__: Context;
1323
+ }
392
1324
  declare class FastEventScope<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never, Types extends keyof Events = keyof Events, FinalMeta extends Record<string, any> = FastEventMeta & FastEventScopeMeta & Meta> {
393
1325
  __FastEventScope__: boolean;
1326
+ readonly __events__: Events;
1327
+ readonly __meta__: Meta & FastEventScopeMeta;
1328
+ readonly __context__: Context;
394
1329
  private _options;
395
1330
  types: {
396
- events: Events;
1331
+ events: ExtendWildcardEvents<Events>;
1332
+ eventNames: KeyOf<ExtendWildcardEvents<Events>>;
1333
+ messages: MutableMessage<Events, FinalMeta>;
1334
+ rawEvents: Events;
397
1335
  meta: FinalMeta;
398
- context: Fallback<Context, typeof this>;
399
- message: TypedFastEventMessageOptional<Events, FinalMeta>;
400
- listeners: FastEventListeners<Events, FinalMeta>;
401
- anyListener: TypedFastEventAnyListener<Events, FinalMeta, Fallback<Context, typeof this>>;
402
1336
  };
403
1337
  prefix: string;
404
1338
  emitter: FastEvent<any>;
@@ -409,7 +1343,7 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
409
1343
  * 获取监听器
410
1344
  * @returns 监听器
411
1345
  */
412
- get listeners(): FastListenerMeta[];
1346
+ get listeners(): FastEventListenerMeta[];
413
1347
  bind(emitter: FastEvent<any>, prefix: string, options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>): void;
414
1348
  /**
415
1349
  * 初始化选项
@@ -430,22 +1364,20 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
430
1364
  private _getScopeListener;
431
1365
  private _getScopeType;
432
1366
  private _fixScopeType;
433
- on<T extends Types = Types>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
434
- on<T extends Exclude<string, Types>>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
435
- on(type: '**', options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
436
- on<T extends keyof OmitTransformedEvents<Events>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
437
- on<T extends keyof PickTransformedEvents<Events>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<Events, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<Events, Meta>): FastEventSubscriber;
438
- on<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<Events, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
439
- on(type: '**', listener: TypedFastEventAnyListener<Events, FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
440
- once<T extends Types = Types>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
441
- once<T extends Exclude<string, Types>>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
442
- once<T extends keyof OmitTransformedEvents<Events>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
443
- once<T extends keyof PickTransformedEvents<Events>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<Events, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<Events, Meta>): FastEventSubscriber;
444
- once<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<Events, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
445
- onAny(options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber;
446
- onAny<P = any>(listener: TypedFastEventAnyListener<{
447
- [K: string]: P;
448
- }, FinalMeta, Fallback<Context, typeof this>>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber;
1367
+ on<T extends string = KeyOf<Events> | "**">(type: T, options?: FastEventListenOptions<Events, FinalMeta>): T extends IsTransformedEvent<Events, T> ? FastEventIterator<T extends "**" ? IsAllTransformed<Events> extends true ? PayloadValues<Events> : any : PickPayload<ValueOf<GetClosestEvents<Events, T>>>> : FastEventIterator<T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, FinalMeta>>;
1368
+ on<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<Events, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, FinalMeta>, FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
1369
+ /**
1370
+ * 只订阅一次
1371
+ * @param type
1372
+ * @param options
1373
+ */
1374
+ once<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<Events, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, FinalMeta>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
1375
+ /**
1376
+ * 订阅全部
1377
+ * @param options
1378
+ */
1379
+ onAny(options?: FastEventListenOptions<Events, FinalMeta>): FastEventIterator<MutableMessage<Events, FinalMeta>>;
1380
+ onAny(listener: FastEventCommonListener<MutableMessage<Events, FinalMeta>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
449
1381
  off(listener: TypedFastEventListener<any, any, any>): void;
450
1382
  off(type: string, listener: TypedFastEventListener<any, any, any>): void;
451
1383
  off(type: Types, listener: TypedFastEventListener<any, any, any>): void;
@@ -453,32 +1385,32 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
453
1385
  off(type: Types): void;
454
1386
  offAll(): void;
455
1387
  clear(): void;
456
- emit(type: Types, directive: symbol): void;
457
- emit(type: string, directive: symbol): void;
458
- emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, retain?: boolean): R[];
459
- emit<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : RecordValues<WildcardEvents<Events, T>>>, retain?: boolean): R[];
460
- emit<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : RecordValues<WildcardEvents<Events, T>>>, options?: FastEventListenerArgs<FinalMeta>): R[];
461
- emit<R = any>(message: FastEventEmitMessage<AtPayloads<Events>, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
462
- emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
463
- [K in T]: PickPayload<K extends Types ? Events[K] : any>;
464
- }, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
1388
+ /**
1389
+ * 触发事件
1390
+ * @param type
1391
+ * @param directive
1392
+ */
1393
+ emit<R = any, T extends Types = Types>(type: T, payload?: UnTransformedEvents<Events>[T], retain?: boolean): R[];
1394
+ emit<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<Events>, T> : any, retain?: boolean): R[];
1395
+ emit<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<Events>, T> : any, options?: FastEventListenerArgs<Partial<FinalMeta>>): R[];
1396
+ emit<R = any, T extends KeyOf<Events> = KeyOf<Events>>(message: FastEventEmitMessage<T, UnTransformedEvents<Events>[T], Partial<FinalMeta>>, retain?: boolean): R[];
1397
+ emit<R = any>(message: MutableMessage<Events, FinalMeta>, retain?: boolean): R[];
1398
+ emit<R = any>(message: {
1399
+ type: keyof Events;
1400
+ }, retain?: boolean): R[];
1401
+ emit<R = any, T extends string = string>(type: T, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<Events>, T> : any, retain?: boolean): R[];
465
1402
  private _transformMessage;
466
- emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, retain?: boolean): Promise<[R | Error][]>;
467
- emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : any>, retain?: boolean): Promise<[R | Error][]>;
468
- emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
469
- emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : any>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
470
- emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
471
- [K in T]: PickPayload<K extends Types ? Events[K] : any>;
472
- }, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
473
- waitFor<T extends Types>(type: T, timeout?: number): Promise<TypedFastEventMessage<{
474
- [key in T]: Events[T];
475
- }, FinalMeta>>;
476
- waitFor(type: string, timeout?: number): Promise<TypedFastEventMessage<{
477
- [key: string]: any;
478
- }, FinalMeta>>;
479
- waitFor<P = any>(type: string, timeout?: number): Promise<TypedFastEventMessage<{
480
- [key: string]: P;
481
- }, FinalMeta>>;
1403
+ emitAsync<R = any, T extends Types = Types>(type: T, payload?: UnTransformedEvents<Events>[T], retain?: boolean): Promise<(R | Error)[]>;
1404
+ emitAsync<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<Events>, T> : any, retain?: boolean): Promise<(R | Error)[]>;
1405
+ emitAsync<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<Events>, T> : any, options?: FastEventListenerArgs<Partial<FinalMeta>>): Promise<(R | Error)[]>;
1406
+ emitAsync<R = any, T extends KeyOf<Events> = KeyOf<Events>>(message: FastEventEmitMessage<T, UnTransformedEvents<Events>[T], Partial<FinalMeta>>, retain?: boolean): Promise<(R | Error)[]>;
1407
+ emitAsync<R = any>(message: MutableMessage<Events, FinalMeta>, retain?: boolean): Promise<(R | Error)[]>;
1408
+ emitAsync<R = any>(message: {
1409
+ type: keyof Events;
1410
+ }, retain?: boolean): Promise<(R | Error)[]>;
1411
+ emitAsync<R = any, T extends string = string>(type: T, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<Events>, T> : any, retain?: boolean): Promise<(R | Error)[]>;
1412
+ waitFor<T extends string = KeyOf<Events>>(type: T, timeout?: number): Promise<T extends IsTransformedEvent<Events, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : FastEventMessage<T, GetClosestEventPayload<Events, T>, FinalMeta>>;
1413
+ waitFor<T extends string = string>(type: T, timeout?: number): Promise<TypedFastEventMessage<Events, FinalMeta>>;
482
1414
  /**
483
1415
  * 创建一个新的作用域实例
484
1416
  * @param prefix - 作用域前缀
@@ -511,16 +1443,9 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
511
1443
  * profileScope.emit('update', { name: 'John' });
512
1444
  * ```
513
1445
  */
514
- scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>): FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>;
515
- scope<E extends Record<string, any> = Record<string, any>, P extends string = string, C = Context, ScopeObject extends InstanceType<Class> = InstanceType<Class>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta>>): FastEventScopeExtend<Events, P, ScopeObject>;
516
- scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context, ScopeInstance extends FastEventScope<Record<string, any>, any, any> = FastEventScope<Record<string, any>, any, any>>(prefix: P, scopeObj: ScopeInstance, options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>): ScopeInstance & FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>;
517
- /**
518
- * 当on/once/onAny未指定监听器时,此为默认监听器
519
- * @param message
520
- */
521
- onMessage(message: TypedFastEventMessage<Events, FinalMeta>, args: FastEventListenerArgs<FinalMeta>): void;
1446
+ scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>): FastEventScope<ScopeEvents<Events & E, P>, FinalMeta & M, C>;
1447
+ scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context, ScopeInstance extends IFastEventScope<Record<string, any>, any, any> = FastEventScope<Record<string, any>, any, any>>(prefix: P, scopeObj: ScopeInstance, options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>): FastEventScope<ScopeEvents<Events & E, P>, FinalMeta & M, C> & ScopeInstance;
522
1448
  }
523
- type FastEventScopeExtend<Events extends Record<string, any>, Prefix extends string, T extends InstanceType<Class> = never> = FastEventScope<ScopeEvents<Events, Prefix>> & T;
524
1449
 
525
1450
  /**
526
1451
  * FastEvent 事件发射器类
@@ -529,7 +1454,7 @@ type FastEventScopeExtend<Events extends Record<string, any>, Prefix extends str
529
1454
  * @template Meta - 事件元数据类型,默认为任意键值对对象
530
1455
  * @template Types - 事件类型的键名类型,默认为Events的键名类型
531
1456
  */
532
- declare class FastEvent<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never, AllEvents extends Record<string, any> = Expand<Events & FastEvents>, Types extends keyof AllEvents = Expand<Exclude<keyof AllEvents, number | symbol>>> {
1457
+ declare class FastEvent<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never, AllEvents extends Record<string, any> = Expand<Events & FastEvents>, Types extends keyof AllEvents = KeyOf<AllEvents>, AllMeta extends Record<string, any> = FastEventMeta & Meta, EventNames = KeyOf<ExtendWildcardEvents<AllEvents>>> {
533
1458
  __FastEvent__: boolean;
534
1459
  /** 事件监听器树结构,存储所有注册的事件监听器 */
535
1460
  listeners: FastListeners;
@@ -544,12 +1469,14 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
544
1469
  /** 当前注册的监听器总数 */
545
1470
  listenerCount: number;
546
1471
  types: {
547
- events: AllEvents;
548
- meta: Expand<FastEventMeta & Meta & Record<string, any>>;
549
- context: Expand<Fallback<Context, typeof this>>;
550
- message: TypedFastEventMessageOptional<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
1472
+ events: ExtendWildcardEvents<AllEvents>;
1473
+ eventNames: KeyOf<ExtendWildcardEvents<AllEvents>>;
1474
+ meta: AllMeta;
1475
+ context: Expand<Fallback<Context, FastEvent<AllEvents, Meta, Context>>>;
1476
+ messages: MutableMessage<AllEvents, Meta>;
1477
+ message: MutableMessage<AllEvents, Meta>;
551
1478
  listeners: FastEventListeners<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
552
- anyListener: TypedFastEventAnyListener<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>, Expand<Fallback<Context, typeof this>>>;
1479
+ anyListener: TypedFastEventAnyListener<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
553
1480
  };
554
1481
  /**
555
1482
  * 创建FastEvent实例
@@ -607,7 +1534,14 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
607
1534
  * @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器
608
1535
  */
609
1536
  private _removeListener;
610
- private _pipeListener;
1537
+ /**
1538
+ * 调用onAddListener HOOK
1539
+ * @param type
1540
+ * @param listener
1541
+ * @param options
1542
+ * @returns
1543
+ */
1544
+ private _onAddListener;
611
1545
  /**
612
1546
  * 注册事件监听器
613
1547
  * @param type - 事件类型,支持以下格式:
@@ -632,13 +1566,8 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
632
1566
  * emitter.on('event', handler, { count: 3 });
633
1567
  * ```
634
1568
  */
635
- on<T extends Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
636
- on<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
637
- on(type: '**', options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
638
- on<T extends keyof OmitTransformedEvents<AllEvents>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
639
- on<T extends keyof PickTransformedEvents<AllEvents>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<AllEvents, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
640
- on<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<AllEvents, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
641
- on(type: '**', listener: TypedFastEventAnyListener<Record<string, any>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
1569
+ on<T extends string = KeyOf<Events> | "**">(type: T, options?: FastEventListenOptions<AllEvents, Meta>): T extends IsTransformedEvent<AllEvents, T> ? FastEventIterator<T extends "**" ? IsAllTransformed<Events> extends true ? PayloadValues<AllEvents> : any : PickPayload<ValueOf<GetClosestEvents<AllEvents, T>>>> : FastEventIterator<T extends "**" ? MutableMessage<AllEvents> : GetClosestMessage<Events, T, Meta>>;
1570
+ on<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<AllEvents, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, Meta>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
642
1571
  /**
643
1572
  * 注册一次性事件监听器
644
1573
  * @param type - 事件类型,支持与on方法相同的格式:
@@ -660,11 +1589,7 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
660
1589
  * });
661
1590
  * ```
662
1591
  */
663
- once<T extends Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
664
- once<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
665
- once<T extends keyof OmitTransformedEvents<AllEvents>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
666
- once<T extends keyof PickTransformedEvents<AllEvents>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<AllEvents, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
667
- once<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<AllEvents, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
1592
+ once<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<AllEvents, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, Meta>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
668
1593
  /**
669
1594
  * 注册一个监听器,用于监听所有事件
670
1595
  * @param listener 事件监听器函数,可以接收任意类型的事件数据
@@ -677,10 +1602,10 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
677
1602
  *
678
1603
  * // 取消监听
679
1604
  * subscriber.off();
680
- * ```listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>): FastEventSubscriber
1605
+ * ```
681
1606
  */
682
- onAny(options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber;
683
- onAny<P = any>(listener: TypedFastEventAnyListener<Record<string, P>, Meta, Fallback<Context, typeof this>>, options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber;
1607
+ onAny(options?: FastEventListenOptions<AllEvents, AllMeta>): FastEventIterator<MutableMessage<AllEvents, AllMeta>>;
1608
+ onAny(listener: FastEventCommonListener<MutableMessage<AllEvents, AllMeta>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, AllMeta>): FastEventSubscriber;
684
1609
  /**
685
1610
  *
686
1611
  * 当调用on/once/onAny时如果没有指定监听器,则调用此方法
@@ -688,7 +1613,6 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
688
1613
  * 此方法供子类继承
689
1614
  *
690
1615
  */
691
- onMessage(message: TypedFastEventMessage<AllEvents, Meta>, args: FastEventListenerArgs<Meta>): void;
692
1616
  off(listener: TypedFastEventListener<any, any, any>): void;
693
1617
  off(type: string, listener: TypedFastEventListener<any, any, any>): void;
694
1618
  off(type: Types, listener: TypedFastEventListener<any, any, any>): void;
@@ -791,13 +1715,18 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
791
1715
  * 减少侦听器的执行次数
792
1716
  * @param listeners
793
1717
  */
794
- _decListenerExecCount(listeners: [FastListenerMeta, number, FastListenerMeta[]][]): void;
1718
+ _decListenerExecCount(listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][]): void;
795
1719
  /**
796
1720
  * 获取指定类型的所有事件监听器
797
1721
  * @param type - 事件类型,必须是 AllEvents 的键
798
1722
  * @returns 包含指定类型的所有监听器元数据的数组
799
1723
  */
800
- getListeners(type: keyof AllEvents): FastListenerMeta[];
1724
+ getListeners(type: keyof AllEvents): FastEventListenerMeta[];
1725
+ /**
1726
+ * 清除所有事件或指定事件的保留消息
1727
+ * @param type
1728
+ */
1729
+ clearRetainMessages(type?: EventNames | string): void;
801
1730
  /**
802
1731
  * 触发事件并执行对应的监听器
803
1732
  *
@@ -855,21 +1784,22 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
855
1784
  * emitter.emit("user/login")
856
1785
  *
857
1786
  * ```
1787
+ *
1788
+ * 为什么事件要使用UnTransformedEvents?
1789
+ *
1790
+ * 因为如果事件使用NotPayload,则会进行转换
1791
+ *
858
1792
  */
859
- emit<T extends Types = Types>(type: T, directive: symbol): any[];
860
- emit(type: string, directive: symbol): any[];
861
- emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, retain?: boolean): R[];
862
- emit<R = any, T extends string = string>(type: T, payload: PickPayload<T extends Types ? AllEvents[T] : RecordValues<WildcardEvents<AllEvents, T>>>, retain?: boolean): R[];
863
- emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
864
- [K in T]: K extends Types ? AllEvents[K] : any;
865
- }, Meta>, retain?: boolean): R[];
866
- emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): R[];
867
- emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, options?: FastEventListenerArgs<Meta>): R[];
868
- emit<R = any, T extends string = string>(type: T, payload: PickPayload<T extends Types ? AllEvents[T] : RecordValues<WildcardEvents<AllEvents, T>>>, options?: FastEventListenerArgs<Meta>): R[];
869
- emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
870
- [K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
871
- }, Meta>, options?: FastEventListenerArgs<Meta>): R[];
872
- emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): R[];
1793
+ emit<R = any, T extends Types = Types>(type: T, payload?: UnTransformedEvents<AllEvents>[T], retain?: boolean): R[];
1794
+ emit<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, retain?: boolean): R[];
1795
+ emit<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, options?: FastEventListenerArgs<Partial<Meta>>): R[];
1796
+ emit<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], Partial<Meta>>, retain?: boolean): R[];
1797
+ emit<R = any>(message: MutableMessage<AllEvents, Meta>, retain?: boolean): R[];
1798
+ emit<R = any>(message: {
1799
+ type: keyof AllEvents;
1800
+ }, retain?: boolean): R[];
1801
+ emit<R = any>(message: FastEventMessage, retain?: boolean): R[];
1802
+ emit<R = any, T extends string = string>(type: T, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, retain?: boolean): R[];
873
1803
  /**
874
1804
  * 异步触发事件
875
1805
  * @param type - 事件类型,可以是字符串或预定义的事件类型
@@ -906,18 +1836,15 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
906
1836
  * });
907
1837
  * ```
908
1838
  */
909
- emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, retain?: boolean): Promise<[R | Error][]>;
910
- emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? AllEvents[T] : any>, retain?: boolean): Promise<[R | Error][]>;
911
- emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
912
- [K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
913
- }, Meta>, retain?: boolean): Promise<[R | Error][]>;
914
- emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): Promise<[R | Error][]>;
915
- emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? AllEvents[T] : any>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
916
- emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
917
- emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
918
- [K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
919
- }, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
920
- emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
1839
+ emitAsync<R = any, T extends Types = Types>(type: T, payload?: UnTransformedEvents<AllEvents>[T], retain?: boolean): Promise<(R | Error)[]>;
1840
+ emitAsync<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, retain?: boolean): Promise<(R | Error)[]>;
1841
+ emitAsync<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, options?: FastEventListenerArgs<Partial<Meta>>): Promise<(R | Error)[]>;
1842
+ emitAsync<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], Partial<Meta>>, retain?: boolean): Promise<(R | Error)[]>;
1843
+ emitAsync<R = any>(message: MutableMessage<AllEvents, Meta>, retain?: boolean): Promise<(R | Error)[]>;
1844
+ emitAsync<R = any>(message: {
1845
+ type: keyof AllEvents;
1846
+ }, retain?: boolean): Promise<(R | Error)[]>;
1847
+ emitAsync<R = any, T extends string = string>(type: T, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, retain?: boolean): Promise<(R | Error)[]>;
921
1848
  /**
922
1849
  * 等待指定事件发生,返回一个Promise
923
1850
  * @param type - 要等待的事件类型
@@ -951,13 +1878,8 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
951
1878
  *
952
1879
  * ```
953
1880
  */
954
- waitFor<T extends Types>(type: T, timeout?: number): Promise<TypedFastEventMessage<{
955
- [key in T]: AllEvents[T];
956
- }, Meta>>;
957
- waitFor(type: string, timeout?: number): Promise<TypedFastEventMessage<AllEvents, Meta>>;
958
- waitFor<P = any>(type: string, timeout?: number): Promise<TypedFastEventMessage<{
959
- [key: string]: P;
960
- }, Meta>>;
1881
+ waitFor<T extends string = KeyOf<AllEvents>>(type: T, timeout?: number): Promise<T extends IsTransformedEvent<AllEvents, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : FastEventMessage<T, GetClosestEventPayload<AllEvents, T>, Meta>>;
1882
+ waitFor<T extends string = string>(type: T, timeout?: number): Promise<TypedFastEventMessage<AllEvents, Meta>>;
961
1883
  /**
962
1884
  * 创建一个新的事件作用域
963
1885
  * @param prefix - 作用域前缀,将自动添加到该作用域下所有事件名称前
@@ -998,10 +1920,9 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
998
1920
  * userEvents.offAll(); // 清理 'user' 前缀下的所有事件
999
1921
  * ```
1000
1922
  */
1001
- scope<P extends string>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Meta, Context>>): FastEventScope<ScopeEvents<AllEvents, P>, Meta, Context>;
1002
- scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>): FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>;
1003
- scope<E extends Record<string, any> = Record<string, any>, P extends string = string, C = Context, ScopeObject extends InstanceType<Class> = InstanceType<Class>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta>>): FastEventScopeExtend<AllEvents, P, ScopeObject>;
1004
- scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context, ScopeObject extends FastEventScope<any, any, any> = FastEventScope<any, any, any>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>): ScopeObject & FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>;
1923
+ scope<P extends string = string, ScopeInstance extends IFastEventScope = IFastEventScope>(prefix: P, scopeObj: ScopeInstance, options?: DeepPartial<FastEventScopeOptions<Meta>>): FastEventScope<RemoveAnyRecord<ScopeEvents<AllEvents, P> & ScopeInstance["__events__"]>, RemoveAnyRecord<Meta & ScopeInstance["__meta__"]>, RemoveAnyRecord<Context & ScopeInstance["__context__"]>> & ScopeInstance;
1924
+ scope<E = unknown, //用于扩展事件
1925
+ P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>): FastEventScope<ScopeEvents<Events, P> & E, Meta & M, C>;
1005
1926
  }
1006
1927
 
1007
1928
  declare const __FastEvent__: unique symbol;
@@ -1019,9 +1940,6 @@ declare class CancelError extends FastEventError {
1019
1940
  }
1020
1941
  declare class QueueOverflowError extends FastEventError {
1021
1942
  }
1022
- declare const FastEventDirectives: {
1023
- clearRetain: symbol;
1024
- };
1025
1943
 
1026
1944
  declare function isFastEventScope(target: any): target is FastEventScope;
1027
1945
 
@@ -1101,4 +2019,4 @@ declare function isClass(target: unknown): target is new (...args: any[]) => any
1101
2019
 
1102
2020
  declare function isFastEvent(target: any): target is FastEvent;
1103
2021
 
1104
- export { AbortError, type AssertFastMessage, type AtPayloads, CancelError, type ChangeFieldType, type Class, type ClosestWildcardEvents, type DeepPartial, type Dict, type Expand, type ExpandWildcard, type Fallback, FastEvent, FastEventDirectives, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, FastEventListenerFlags, type FastEventListeners, type FastEventMessage, type FastEventMessageExtends, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeExtend, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerMeta, type FastListenerNode, type FastListeners, type FastMessagePayload, type GetFirstMatchedItem, type GetNotWildcardItems, type Keys, type Merge, type MergeUnion, type NotPayload, type ObjectKeys, type OmitTransformedEvents, type OptionalItems, type Overloads, type OverrideOptions, type PickPayload, type PickTransformedEvents, QueueOverflowError, type RecordPrefix, type RecordValues, type RequiredItems, type ScopeEvents, TimeoutError, type TransformedEvents, type TypedFastEventAnyListener, type TypedFastEventListener, type TypedFastEventMessage, type TypedFastEventMessageOptional, UnboundError, type Unique, type WildcardEvents, __FastEventScope__, __FastEvent__, __expandable__, expandable, isClass, isExpandable, isFastEvent, isFastEventMessage, isFastEventScope, isFunction, isPathMatched, isString, isSubsctiber };
2022
+ export { AbortError, type Add, type AllowCall, type ApplyWildcardEvents, type AssertFastMessage, type AssertRecord, type AssertString, type AtPayloads, CancelError, type ChangeFieldType, type Class, type ClosestMatch, type ContainsWildcard, type Decrement, type DeepPartial, type Dict, type Equal, type Expand, type ExpandRecord, type ExpandWildcard, type ExtendWildcardEvents, type Fallback, FastEvent, type FastEventCommonListener, type FastEventCommonMessage, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, FastEventListenerFlags, type FastEventListenerMeta, type FastEventListenerNode, type FastEventListeners, type FastEventMessage, type FastEventMessageExtends, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListeners, type FastMessagePayload, type FirstObjectItem, type FirstOfUnion, type GetClosestEventName, type GetClosestEventNameTuple, type GetClosestEventPayload, type GetClosestEventTuple, type GetClosestEvents, type GetFixedPartCount, type GetMatchedEventNames, type GetPartCount, type GetPartCountAcc, type GetPayload, type GetWildcardCount, type GetWildcardEventList, type IFastEventScope, type IfNever, type IndexOfMax, type IndexOfMin, type IsAllTransformed, type IsAny, type IsAnyRecord, type IsFullWildcard, type IsMatchEventName, type IsMultiWildcard, type IsNever, type IsSemiWildcard, type IsTransformedEvent, type IsWildcardPart, type Join, type KeyOf, type Keys, type Max, type Merge, type MergeStrings, type MergeUnion, type Min, type MutableMessage, type MutableRecord, type NormalEvents, type NotEqual, type NotPayload, type ObjectKeys, type OmitTransformedEvents, type OptionalKeys, type Overloads, type OverrideOptions, type PayloadValues, type PickEqualRecord, type PickInlcudeDelimiterRecord, type PickNotEqualRecord, type PickNotInlcudeDelimiterRecord, type PickPayload, type PickTransformedEvents, type PrefixNumber, type ProcessSegments, QueueOverflowError, type RemoveEmptyObject, type ReplaceWildcard, type RequiredItems, type RequiredKeys, type ScopeEvents, type Slice, type Split, type SplitPath, type StrictEqual, TimeoutError, type ToFixedCounts, type ToKeyPrioritys, type ToWildcardMessage, type TransformedEvents, type Tuple, type TypedFastEventAnyListener, type TypedFastEventListener, type TypedFastEventMessage, type TypedFastEventMessageOptional, type UnTransformedEvents, UnboundError, type Union, type UnionToIntersection, type Unique, type ValueOf, type WildcardEvents, type WildcardKeyToObject, type WildcardKeys, type WildcardStyle, __FastEventScope__, __FastEvent__, __expandable__, expandable, isClass, type isEmpty, isExpandable, isFastEvent, isFastEventMessage, isFastEventScope, isFunction, isPathMatched, isString, isSubsctiber };