@@ -27,12 +27,29 @@ export function onDestroy(fn: () => any) {
27
27
get_current_component ( ) . $$ . on_destroy . push ( fn ) ;
28
28
}
29
29
30
+ type UnionToIntersection < U > = ( U extends any ? ( k : U ) => void : never ) extends ( k : infer I ) => void
31
+ ? I
32
+ : never
33
+
34
+ type ExtractObjectValues < Object extends Record < any , any > > = Object [ keyof Object ]
35
+
36
+ type ConstructDispatchFunction < EventMap extends Record < string , any > , EventKey extends keyof EventMap > =
37
+ EventMap [ EventKey ] extends never
38
+ ? ( type : EventKey ) => void
39
+ : ( type : EventKey , detail : EventMap [ EventKey ] ) => void
40
+
41
+ type CreateDispatchFunctionMap < EventMap > = {
42
+ [ Key in keyof EventMap ] : ConstructDispatchFunction < EventMap , Key >
43
+ }
44
+
45
+ type EventDispatcher < EventMap extends Record < string , any > > = UnionToIntersection < ExtractObjectValues < CreateDispatchFunctionMap < EventMap > > >
46
+
30
47
export function createEventDispatcher <
31
- EventMap extends { } = any
32
- > ( ) : < EventKey extends Extract < keyof EventMap , string > > ( type : EventKey , detail ?: EventMap [ EventKey ] ) => void {
48
+ EventMap extends Record < string , any > = any
49
+ > ( ) : EventDispatcher < EventMap > {
33
50
const component = get_current_component ( ) ;
34
51
35
- return ( type : string , detail ?: any ) => {
52
+ return ( ( type : string , detail ?: any ) => {
36
53
const callbacks = component . $$ . callbacks [ type ] ;
37
54
38
55
if ( callbacks ) {
@@ -43,7 +60,7 @@ export function createEventDispatcher<
43
60
fn . call ( component , event ) ;
44
61
} ) ;
45
62
}
46
- } ;
63
+ } ) as EventDispatcher < EventMap > ;
47
64
}
48
65
49
66
export function setContext < T > ( key , context : T ) {
@@ -59,7 +76,7 @@ export function getAllContexts<T extends Map<any, any> = Map<any, any>>(): T {
59
76
}
60
77
61
78
export function hasContext ( key ) : boolean {
62
- return get_current_component ( ) . $$ . context . has ( key ) ;
79
+ return get_current_component ( ) . $$ . context . has ( key ) ;
63
80
}
64
81
65
82
// TODO figure out if we still want to support
0 commit comments