File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11import type { ReadonlySignal } from "@preact/signals" ;
22import type { Patch } from "immer" ;
3+ import { EventParameters } from "src/listener.js" ;
34import type { SigmaType } from "../framework.js" ;
45import type { Draft , Immutable } from "../immer.js" ;
56import { sigmaEventsBrand , sigmaRefBrand , sigmaStateBrand } from "./symbols.js" ;
@@ -73,9 +74,7 @@ export type EventMethods<TEvents extends AnyEvents | undefined> = [undefined] ex
7374 /** Registers a typed event listener and returns an unsubscribe function. */
7475 on < TEvent extends string & keyof TEvents > (
7576 name : TEvent ,
76- listener : [ TEvents [ TEvent ] ] extends [ void ]
77- ? ( ) => void
78- : ( payload : TEvents [ TEvent ] ) => void ,
77+ listener : ( ...[ detail ] : EventParameters < TEvents [ TEvent ] > ) => void ,
7978 ) : Cleanup ;
8079 } ;
8180
@@ -98,7 +97,7 @@ export type Emit<T extends SigmaDefinition, TOverrides extends Partial<SigmaDefi
9897 ? [ TEvents ] extends [ AnyEvents ]
9998 ? < TEvent extends string & keyof TEvents > (
10099 name : TEvent ,
101- ...args : [ TEvents [ TEvent ] ] extends [ void ] ? [ ] : [ payload : TEvents [ TEvent ] ]
100+ ...[ detail ] : EventParameters < TEvents [ TEvent ] >
102101 ) => void
103102 : never
104103 : never ;
Original file line number Diff line number Diff line change @@ -51,6 +51,13 @@ export type InferEventType<TTarget extends EventTarget> =
5151 | ( InferListener < TTarget > extends { __eventType ?: infer TEvent } ? string & TEvent : never )
5252 | ( string & { } ) ;
5353
54+ /** Infers the detail parameter for a typed emit. */
55+ export type EventParameters < T > = [ void ] extends [ T ]
56+ ? [ detail ?: T extends void ? undefined : T ]
57+ : [ undefined ] extends [ T ]
58+ ? [ detail ?: T ]
59+ : [ detail : T ] ;
60+
5461/**
5562 * A standalone typed event hub with `emit(...)` and `on(...)` methods and full
5663 * `EventTarget`, `listen(...)`, and `useListener(...)` compatibility.
@@ -66,11 +73,9 @@ export class SigmaTarget<TEvents extends AnyEvents = {}> extends EventTarget {
6673 */
6774 emit < TEvent extends string & keyof TEvents > (
6875 name : TEvent ,
69- ...args : [ TEvents [ TEvent ] ] extends [ void ] ? [ ] : [ payload : TEvents [ TEvent ] ]
76+ ...[ detail ] : EventParameters < TEvents [ TEvent ] >
7077 ) {
71- this . dispatchEvent (
72- args . length === 0 ? new Event ( name ) : new CustomEvent ( name , { detail : args [ 0 ] } ) ,
73- ) ;
78+ this . dispatchEvent ( detail === undefined ? new Event ( name ) : new CustomEvent ( name , { detail } ) ) ;
7479 }
7580
7681 /**
You can’t perform that action at this time.
0 commit comments