Skip to content

Commit aea27fe

Browse files
authored
feat: export type helpers under Emitter namespace (#4)
1 parent b8bfe69 commit aea27fe

File tree

2 files changed

+66
-61
lines changed

2 files changed

+66
-61
lines changed

README.md

+9-6
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,10 @@ Apart from being strongly-typed from the ground up, the library provides you wit
182182
Infers the type of the given event's listener.
183183

184184
```ts
185-
import { Emitter, InferListenerType } from 'rettime'
185+
import { Emitter } from 'rettime'
186186

187187
const emitter = new Emitter<{ greeting: [string] }>()
188-
type GreetingListener = InferListenerType<typeof emitter, 'greeting'>
188+
type GreetingListener = Emitter.InferListenerType<typeof emitter, 'greeting'>
189189
// (event: MessageEvent<string>) => void
190190
```
191191
@@ -196,10 +196,13 @@ type GreetingListener = InferListenerType<typeof emitter, 'greeting'>
196196
Infers the return type of the given event's listener.
197197
198198
```ts
199-
import { Emitter, GreetingListener } from 'rettime'
199+
import { Emitter } from 'rettime'
200200

201201
const emitter = new Emitter<{ getTotalPrice: [Cart, number] }>()
202-
type CartTotal = InferListenerReturnType<typeof emitter, 'getTotalPrice'>
202+
type CartTotal = Emitter.InferListenerReturnType<
203+
typeof emitter,
204+
'getTotalPrice'
205+
>
203206
// number
204207
```
205208
@@ -208,9 +211,9 @@ type CartTotal = InferListenerReturnType<typeof emitter, 'getTotalPrice'>
208211
Infers the `Event` type (or its subtype) representing the given listener.
209212
210213
```ts
211-
import { Emitter, InferEventType } from 'rettime'
214+
import { Emitter } from 'rettime'
212215

213216
const emitter = new Emitter<{ greeting: [string] }>()
214-
type GreetingEvent = InferListenerType<typeof emitter, 'greeting'>
217+
type GreetingEvent = Emitter.InferListenerType<typeof emitter, 'greeting'>
215218
// MessageEvent<string>
216219
```

src/index.ts

+57-55
Original file line numberDiff line numberDiff line change
@@ -17,51 +17,6 @@ type InferEventMap<Target extends Emitter<any>> = Target extends Emitter<
1717
? T
1818
: never
1919

20-
/**
21-
* Infers the listener type for the given event type.
22-
*
23-
* @example
24-
* const emitter = new Emitter<{ getTotalPrice: [Cart, number] }>()
25-
* type Listener = InferListenerType<typeof emitter, 'getTotalPrice'>
26-
* // (event: MessageEvent<Cart>) => number
27-
*/
28-
export type InferListenerType<
29-
Target extends Emitter<any>,
30-
Type extends keyof EventMap & string,
31-
EventMap extends DefaultEventMap = InferEventMap<Target>,
32-
> = StrictEventListener<
33-
InferEventType<Target, Type, EventMap>,
34-
InferListenerReturnType<Target, Type, EventMap>
35-
>
36-
37-
/**
38-
* Infers the return type of the listener for the given event type.
39-
*
40-
* @example
41-
* const emitter = new Emitter<{ getTotalPrice: [Cart, number] }>()
42-
* type ListenerReturnType = InferListenerReturnType<typeof emitter, 'getTotalPrice'>
43-
* // number
44-
*/
45-
export type InferListenerReturnType<
46-
Target extends Emitter<any>,
47-
Type extends keyof EventMap & string,
48-
EventMap extends DefaultEventMap = InferEventMap<Target>,
49-
> = EventMap[Type][1]
50-
51-
/**
52-
* Infers an appropriate `Event` type for the given event type.
53-
*
54-
* @example
55-
* const emitter = new Emitter<{ greeting: [string] }>()
56-
* type GreetingEvent = InferEventType<typeof emitter, 'greeting'>
57-
* // MessageEvent<string>
58-
*/
59-
export type InferEventType<
60-
Target extends Emitter<any>,
61-
Type extends keyof EventMap & string,
62-
EventMap extends DefaultEventMap = InferEventMap<Target>,
63-
> = DataToEvent<Type, EventMap[Type][0]>
64-
6520
type DataToEvent<Type extends string, Data extends unknown> = [Data] extends [
6621
never,
6722
]
@@ -75,8 +30,8 @@ type InternalListenersMap<
7530
keyof EventMap,
7631
Array<
7732
StrictEventListener<
78-
InferEventType<Target, keyof EventMap & string, EventMap>,
79-
InferListenerReturnType<Target, keyof EventMap & string, EventMap>
33+
Emitter.InferEventType<Target, keyof EventMap & string, EventMap>,
34+
Emitter.InferListenerReturnType<Target, keyof EventMap & string, EventMap>
8035
>
8136
>
8237
>
@@ -87,6 +42,53 @@ type EmmiterListenerOptions = {
8742

8843
const kPropagationStopped = Symbol('kPropagationStopped')
8944

45+
export namespace Emitter {
46+
/**
47+
* Infers the listener type for the given event type.
48+
*
49+
* @example
50+
* const emitter = new Emitter<{ getTotalPrice: [Cart, number] }>()
51+
* type Listener = InferListenerType<typeof emitter, 'getTotalPrice'>
52+
* // (event: MessageEvent<Cart>) => number
53+
*/
54+
export type InferListenerType<
55+
Target extends Emitter<any>,
56+
Type extends keyof EventMap & string,
57+
EventMap extends DefaultEventMap = InferEventMap<Target>,
58+
> = StrictEventListener<
59+
InferEventType<Target, Type, EventMap>,
60+
InferListenerReturnType<Target, Type, EventMap>
61+
>
62+
63+
/**
64+
* Infers the return type of the listener for the given event type.
65+
*
66+
* @example
67+
* const emitter = new Emitter<{ getTotalPrice: [Cart, number] }>()
68+
* type ListenerReturnType = InferListenerReturnType<typeof emitter, 'getTotalPrice'>
69+
* // number
70+
*/
71+
export type InferListenerReturnType<
72+
Target extends Emitter<any>,
73+
Type extends keyof EventMap & string,
74+
EventMap extends DefaultEventMap = InferEventMap<Target>,
75+
> = EventMap[Type][1]
76+
77+
/**
78+
* Infers an appropriate `Event` type for the given event type.
79+
*
80+
* @example
81+
* const emitter = new Emitter<{ greeting: [string] }>()
82+
* type GreetingEvent = InferEventType<typeof emitter, 'greeting'>
83+
* // MessageEvent<string>
84+
*/
85+
export type InferEventType<
86+
Target extends Emitter<any>,
87+
Type extends keyof EventMap & string,
88+
EventMap extends DefaultEventMap = InferEventMap<Target>,
89+
> = DataToEvent<Type, EventMap[Type][0]>
90+
}
91+
9092
export class Emitter<EventMap extends DefaultEventMap> {
9193
#listeners: InternalListenersMap<typeof this, EventMap>
9294
#listenerOptions: WeakMap<Function, AddEventListenerOptions>
@@ -105,7 +107,7 @@ export class Emitter<EventMap extends DefaultEventMap> {
105107
*/
106108
public on<Type extends keyof EventMap & string>(
107109
type: Type,
108-
listener: InferListenerType<typeof this, Type, EventMap>,
110+
listener: Emitter.InferListenerType<typeof this, Type, EventMap>,
109111
options?: EmmiterListenerOptions,
110112
): AbortController {
111113
this.#addListener(type, listener)
@@ -125,7 +127,7 @@ export class Emitter<EventMap extends DefaultEventMap> {
125127
*/
126128
public once<Type extends keyof EventMap & string>(
127129
type: Type,
128-
listener: InferListenerType<typeof this, Type, EventMap>,
130+
listener: Emitter.InferListenerType<typeof this, Type, EventMap>,
129131
options?: EmmiterListenerOptions,
130132
): AbortController {
131133
this.#addListener(type, listener)
@@ -146,7 +148,7 @@ export class Emitter<EventMap extends DefaultEventMap> {
146148
*/
147149
public earlyOn<Type extends keyof EventMap & string>(
148150
type: Type,
149-
listener: InferListenerType<typeof this, Type, EventMap>,
151+
listener: Emitter.InferListenerType<typeof this, Type, EventMap>,
150152
options?: EmmiterListenerOptions,
151153
): AbortController {
152154
if (!this.#listeners[type]) {
@@ -170,7 +172,7 @@ export class Emitter<EventMap extends DefaultEventMap> {
170172
*/
171173
public earlyOnce<Type extends keyof EventMap & string>(
172174
type: Type,
173-
listener: InferListenerType<typeof this, Type, EventMap>,
175+
listener: Emitter.InferListenerType<typeof this, Type, EventMap>,
174176
): AbortController {
175177
this.earlyOn(type, listener)
176178

@@ -294,7 +296,7 @@ export class Emitter<EventMap extends DefaultEventMap> {
294296
*/
295297
public removeListener<Type extends keyof EventMap & string>(
296298
type: Type,
297-
listener: InferListenerType<typeof this, Type, EventMap>,
299+
listener: Emitter.InferListenerType<typeof this, Type, EventMap>,
298300
): void {
299301
this.#listenerOptions.delete(listener)
300302

@@ -342,7 +344,7 @@ export class Emitter<EventMap extends DefaultEventMap> {
342344
*/
343345
public listeners<Type extends keyof EventMap & string>(
344346
type?: Type,
345-
): Array<InferListenerType<typeof this, Type, EventMap>> {
347+
): Array<Emitter.InferListenerType<typeof this, Type, EventMap>> {
346348
if (type == null) {
347349
return Object.values(this.#listeners).flat()
348350
}
@@ -362,7 +364,7 @@ export class Emitter<EventMap extends DefaultEventMap> {
362364

363365
#addListener<Type extends keyof EventMap & string>(
364366
type: Type,
365-
listener: InferListenerType<typeof this, Type, EventMap>,
367+
listener: Emitter.InferListenerType<typeof this, Type, EventMap>,
366368
) {
367369
if (!this.#listeners[type]) {
368370
this.#listeners[type] = []
@@ -428,7 +430,7 @@ export class Emitter<EventMap extends DefaultEventMap> {
428430

429431
#createAbortController<Type extends keyof EventMap & string>(
430432
type: Type,
431-
listener: InferListenerType<typeof this, Type, EventMap>,
433+
listener: Emitter.InferListenerType<typeof this, Type, EventMap>,
432434
): AbortController {
433435
const abortController = new AbortController()
434436

0 commit comments

Comments
 (0)