1 | export type MatchingKeys<T, U, K extends keyof T = keyof T> =
|
2 | K extends (T[K] extends U ? K : never) ? K : never;
|
3 |
|
4 | export type VoidKeys<Record> = MatchingKeys<Record, void>;
|
5 |
|
6 |
|
7 | export interface TypeRecord<T, U, V> {
|
8 | ' _emitterType'?: T,
|
9 | ' _eventsType'?: U,
|
10 | ' _emitType'?: V
|
11 | }
|
12 |
|
13 | export type OverriddenKeys = 'on' | 'emit' | 'addListener' | 'once' | 'removeListener' | 'addEventListener';
|
14 |
|
15 | export type StrictEventEmitter<
|
16 | TEmitterType,
|
17 | TEventRecord,
|
18 | TEmitRecord = TEventRecord,
|
19 | EventVK extends VoidKeys<TEventRecord> = VoidKeys<TEventRecord>,
|
20 | EventNVK extends Exclude<keyof TEventRecord, EventVK> = Exclude<keyof TEventRecord, EventVK>,
|
21 | EmitVK extends VoidKeys<TEmitRecord> = VoidKeys<TEmitRecord>,
|
22 | EmitNVK extends Exclude<keyof TEmitRecord, EmitVK> = Exclude<keyof TEmitRecord, EmitVK>,
|
23 | UnneededMethods extends Exclude<OverriddenKeys, keyof TEmitterType> = Exclude<OverriddenKeys, keyof TEmitterType>,
|
24 | NeededMethods extends Exclude<OverriddenKeys, UnneededMethods> = Exclude<OverriddenKeys, UnneededMethods>
|
25 | > =
|
26 | TypeRecord<TEmitterType, TEventRecord, TEmitRecord> &
|
27 | Pick<TEmitterType, Exclude<keyof TEmitterType, OverriddenKeys>> &
|
28 | Pick<{
|
29 | on<P extends EventNVK>(event: P, listener: (m: TEventRecord[P], ...args: any[]) => void): any;
|
30 | on<P extends EventVK>(event: P, listener: () => void): any;
|
31 |
|
32 | addListener<P extends EventNVK>(event: P, listener: (m: TEventRecord[P], ...args: any[]) => void): any
|
33 | addListener<P extends EventVK>(event: P, listener: () => void): any;
|
34 |
|
35 | addEventListener<P extends EventNVK>(event: P, listener: (m: TEventRecord[P], ...args: any[]) => void): any
|
36 | addEventListener<P extends EventVK>(event: P, listener: () => void): any;
|
37 |
|
38 | removeListener<P extends EventVK>(event: P, listener: Function): any;
|
39 |
|
40 | once<P extends EventNVK>(event: P, listener: (m: TEventRecord[P], ...args: any[]) => void): any
|
41 | once<P extends EventVK>(event: P, listener: () => void): any;
|
42 |
|
43 | emit<P extends EmitNVK>(event: P, request: TEmitRecord[P]): any;
|
44 | emit<P extends EmitVK>(event: P): any;
|
45 | }, NeededMethods>;
|
46 |
|
47 | export default StrictEventEmitter;
|
48 |
|
49 | export type NoUndefined<T> = T extends undefined ? never : T;
|
50 |
|
51 | export type StrictBroadcast<
|
52 | TEmitter extends TypeRecord<any, any, any>,
|
53 | TEmitRecord extends NoUndefined<TEmitter[' _emitType']> = NoUndefined<TEmitter[' _emitType']>,
|
54 | VK extends VoidKeys<TEmitRecord> = VoidKeys<TEmitRecord>,
|
55 | NVK extends Exclude<keyof TEmitRecord, VK> = Exclude<keyof TEmitRecord, VK>
|
56 | > = {
|
57 | <E extends NVK>(event: E, request: TEmitRecord[E]): void;
|
58 | <E extends VK>(event: E): void;
|
59 | }
|
60 |
|
\ | No newline at end of file |