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/devTools.js.map +1 -1
- package/dist/devTools.mjs.map +1 -1
- package/dist/executors/index.d.mts +67 -19
- package/dist/executors/index.d.ts +67 -19
- package/dist/executors/index.js +1 -1
- package/dist/executors/index.js.map +1 -1
- package/dist/executors/index.mjs +1 -1
- package/dist/executors/index.mjs.map +1 -1
- package/dist/index.d.mts +1240 -322
- package/dist/index.d.ts +1240 -322
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/pipes/index.d.mts +71 -22
- package/dist/pipes/index.d.ts +71 -22
- package/dist/pipes/index.js +1 -1
- package/dist/pipes/index.js.map +1 -1
- package/dist/pipes/index.mjs +1 -1
- package/dist/pipes/index.mjs.map +1 -1
- package/package.json +15 -19
- package/dist/eventbus/index.d.mts +0 -1278
- package/dist/eventbus/index.d.ts +0 -1278
- package/dist/eventbus/index.js +0 -2
- package/dist/eventbus/index.js.map +0 -1
- package/dist/eventbus/index.mjs +0 -2
- package/dist/eventbus/index.mjs.map +0 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,92 +1,842 @@
|
|
|
1
|
-
|
|
1
|
+
import { Sum, LessThan, ValueOf as ValueOf$1, Subtract, UnionToTuple as UnionToTuple$1 } from 'type-fest';
|
|
2
2
|
|
|
3
|
-
type
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
27
|
-
type
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
40
|
-
*
|
|
41
|
-
|
|
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
|
|
45
|
-
|
|
46
|
-
|
|
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]
|
|
49
|
-
|
|
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
|
|
55
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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/*"> = true (末尾单级通配符)
|
|
778
|
+
* - IsMatchEventName<"user/login", "*/login"> = true (开头单级通配符)
|
|
779
|
+
* - IsMatchEventName<"user/profile/edit", "user/**"> = 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
|
|
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 &
|
|
820
|
+
meta?: FastEventMeta & M & Record<string, any>;
|
|
82
821
|
} & FastEventMessageExtends;
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
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
|
|
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
|
|
101
|
-
meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
|
|
878
|
+
payload: Events[K];
|
|
102
879
|
};
|
|
103
|
-
}[Exclude<keyof Events, number | symbol>]
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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:
|
|
1115
|
+
onAfterExecuteListener?: (message: TypedFastEventMessage<any, Meta>, returns: any[], listeners: FastEventListenerNode[]) => void;
|
|
175
1116
|
/**
|
|
176
1117
|
* 全局执行器
|
|
177
1118
|
*/
|
|
178
1119
|
executor?: FastListenerExecutor;
|
|
179
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
type
|
|
243
|
-
[K in
|
|
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
|
|
255
|
-
type
|
|
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
|
-
*
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
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
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
-
*
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
|
333
|
-
|
|
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
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
type
|
|
357
|
-
|
|
358
|
-
type
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
|
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():
|
|
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
|
|
434
|
-
on<T extends
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
once<T extends
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
onAny(options?:
|
|
446
|
-
onAny<
|
|
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
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
emit<R = any>(
|
|
462
|
-
emit<R = any, T extends string = string>(
|
|
463
|
-
|
|
464
|
-
|
|
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?:
|
|
467
|
-
emitAsync<R = any, T extends string = string>(type: T, payload?:
|
|
468
|
-
emitAsync<R = any, T extends
|
|
469
|
-
emitAsync<R = any, T extends
|
|
470
|
-
emitAsync<R = any,
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
waitFor(type:
|
|
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
|
|
515
|
-
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, C = Context,
|
|
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 =
|
|
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
|
-
|
|
549
|
-
|
|
550
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
636
|
-
on<T extends string>(type: T,
|
|
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
|
|
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
|
-
* ```
|
|
1605
|
+
* ```
|
|
681
1606
|
*/
|
|
682
|
-
onAny(options?:
|
|
683
|
-
onAny
|
|
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: [
|
|
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):
|
|
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,
|
|
860
|
-
emit(type:
|
|
861
|
-
emit<R = any, T extends
|
|
862
|
-
emit<R = any, T extends
|
|
863
|
-
emit<R = any,
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
emit<R = any
|
|
868
|
-
emit<R = any, T extends string = string>(type: T, payload
|
|
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?:
|
|
910
|
-
emitAsync<R = any, T extends string = string>(type: T, payload?:
|
|
911
|
-
emitAsync<R = any, T extends string = string>(
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
emitAsync<R = any>(message:
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
emitAsync<R = any, T extends string = string>(
|
|
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
|
|
955
|
-
|
|
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
|
|
1002
|
-
scope<E
|
|
1003
|
-
|
|
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
|
|
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 };
|