/** * The minimal basic Event that can be dispatched by a {@link EventDispatcher<>}. */ export interface BaseEvent { readonly type: TEventType; } /** * The minimal expected contract of a fired Event that was dispatched by a {@link EventDispatcher<>}. */ export interface Event { readonly type: TEventType; readonly target: TTarget; } export type EventListener = ( event: TEventData & Event, ) => void; /** * JavaScript events for custom objects * @example * ```typescript * // Adding events to a custom object * class Car extends EventDispatcher { * start() { * this.dispatchEvent( { type: 'start', message: 'vroom vroom!' } ); * } * }; * // Using events with the custom object * const car = new Car(); * car.addEventListener( 'start', ( event ) => { * alert( event.message ); * } ); * car.start(); * ``` * @see {@link https://github.com/mrdoob/eventdispatcher.js | mrdoob EventDispatcher on GitHub} * @see {@link https://threejs.org/docs/index.html#api/en/core/EventDispatcher | Official Documentation} * @see {@link https://github.com/mrdoob/three.js/blob/master/src/core/EventDispatcher.js | Source} */ export class EventDispatcher { /** * Creates {@link THREE.EventDispatcher | EventDispatcher} object. */ constructor(); /** * Adds a listener to an event type. * @param type The type of event to listen to. * @param listener The function that gets called when the event is fired. */ addEventListener>( type: T, listener: EventListener, ): void; addEventListener(type: T, listener: EventListener<{}, T, this>): void; /** * Checks if listener is added to an event type. * @param type The type of event to listen to. * @param listener The function that gets called when the event is fired. */ hasEventListener>( type: T, listener: EventListener, ): boolean; hasEventListener(type: T, listener: EventListener<{}, T, this>): boolean; /** * Removes a listener from an event type. * @param type The type of the listener that gets removed. * @param listener The listener function that gets removed. */ removeEventListener>( type: T, listener: EventListener, ): void; removeEventListener(type: T, listener: EventListener<{}, T, this>): void; /** * Fire an event type. * @param event The event that gets fired. */ dispatchEvent>(event: BaseEvent & TEventMap[T]): void; }