/// <reference types="node" />
import type { EventEmitter } from 'events';
import type { Constructor } from 'clone-class';
import type { WechatyMixinProtectedProperty } from '../wechaty-mixins/mod.js';
import type { WechatyEventListeners } from '../schemas/mod.js';
import type { WechatySkeletonProtectedProperty } from './wechaty-skeleton.js';
import { WechatyBase, WechatyBaseProtectedProperty } from './wechaty-base.js';
declare const WechatyImplBase_base: {
    new (...args: any[]): {};
    valid: (o: any) => o is WechatyImplInterface;
    validInstance: (target: any) => target is WechatyBase;
    validInterface: (target: any) => target is WechatyImplInterface;
} & typeof WechatyBase;
/**
 * Huan(202111): this is for solving the circyle dependency problem
 *
 *  Construct a `WechatyImpl` based the `WechatyImplBase` with `validationMixin`
 *
 */
declare class WechatyImplBase extends WechatyImplBase_base {
}
interface WechatyImplInterface extends WechatyImplBase {
}
declare const WechatyImpl_base: {
    new (...args: any[]): {};
    valid: (o: any) => o is WechatyInterface;
    validInstance: (target: any) => target is WechatyImplBase;
    validInterface: (target: any) => target is WechatyInterface;
} & typeof WechatyImplBase;
declare class WechatyImpl extends WechatyImpl_base {
}
/**
 * ^ The above code will make a ready-to-use class: `WechatyImpl`
 *  without any cyclic dependency problem.
 */
declare type AllProtectedProperty = keyof EventEmitter | WechatyMixinProtectedProperty | WechatyBaseProtectedProperty | WechatySkeletonProtectedProperty | `_${string}`;
/**
 * Huan(202111):
 * `on`/`off`/`once` must use TypedEventEmitter<WechatyEventListeners> instead of WechatyImpl
 *    or will run into error: cyclic dependency?
 */
interface WechatyEventEmitter {
    on: <E extends keyof WechatyEventListeners>(event: E, listener: WechatyEventListeners[E]) => WechatyInterface;
    off: <E extends keyof WechatyEventListeners>(event: E, listener: WechatyEventListeners[E]) => WechatyInterface;
    once: <E extends keyof WechatyEventListeners>(event: E, listener: WechatyEventListeners[E]) => WechatyInterface;
}
declare type WechatyInterface = Omit<WechatyImplInterface, AllProtectedProperty> & WechatyEventEmitter;
declare type WechatyConstructor = Constructor<WechatyInterface, typeof WechatyImpl>;
export { type WechatyInterface, type WechatyConstructor, type AllProtectedProperty, WechatyImpl, };
//# sourceMappingURL=wechaty-impl.d.ts.map