UNPKG

2.71 kBPlain TextView Raw
1export type MatchingKeys<T, U, K extends keyof T = keyof T> =
2 K extends (T[K] extends U ? K : never) ? K : never;
3
4export type VoidKeys<Record> = MatchingKeys<Record, void>;
5
6// really wish I could stash these under a unique symbol key
7export interface TypeRecord<T, U, V> {
8 ' _emitterType'?: T,
9 ' _eventsType'?: U,
10 ' _emitType'?: V
11}
12
13export type OverriddenKeys = 'on' | 'emit' | 'addListener' | 'once' | 'removeListener' | 'addEventListener';
14
15export 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> & // stores metadata
27 Pick<TEmitterType, Exclude<keyof TEmitterType, OverriddenKeys>> & // has all the properties of
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
47export default StrictEventEmitter;
48
49export type NoUndefined<T> = T extends undefined ? never : T;
50
51export 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