export type ObservableTopics = {
    readonly [K: string]: unknown;
};
export type ObservableTopicMap<T extends ObservableTopics> = {
    [K in keyof T]: Set<((message: T[K]) => void)>;
};
export declare class Observable<T extends ObservableTopics> {
    protected readonly topics: Partial<ObservableTopicMap<T>>;
    constructor();
    subscribe<K extends keyof T>(topic: K, ...fn: ((message: T[K]) => void)[]): void;
    once<K extends keyof T>(topic: K, ...fn: ((message: T[K]) => void)[]): void;
    unsubscribe<K extends keyof T>(topic: K, ...fn: ((message: T[K]) => void)[]): void;
    protected publish<K extends keyof T>(topic: K, message: T[K]): () => void;
    protected publishSync<K extends keyof T>(topic: K, message: T[K]): void;
}
//# sourceMappingURL=Observable.d.ts.map