export interface Event<T> {
    name: string;
    props: T;
}
export declare type EventCallbackFn<T> = (data: T) => void;
export declare type ChanneledEventBus<T = EventBus> = EventBus & {
    parent: T;
};
export declare class EventBus {
    readonly parent?: EventBus | undefined;
    readonly identifier?: string | undefined;
    private readonly listeners;
    constructor(parent?: EventBus | undefined, identifier?: string | undefined);
    channel(identifier?: string): ChanneledEventBus<this>;
    root(): EventBus;
    addEventListener<T = never>(event: string, callbackFn: EventCallbackFn<T>): void;
    removeEventListener<T = never>(event: string, callbackFn?: EventCallbackFn<T>): void;
    dispatch<T = never>(event: string, data?: T, broadcast?: boolean): void;
}
