import { ChangeDetectorRef, EventEmitter, Injector, OnDestroy, Type } from '@angular/core';
import { ControlValueAccessor, NgControl } from '@angular/forms';
import { FormComponent } from '../components/form/form.component';
import * as i0 from "@angular/core";
export declare function ngValueAccessor<T>(clazz: Type<T>): {
    provide: import("@angular/core").InjectionToken<readonly ControlValueAccessor[]>;
    useExisting: Type<any>;
    multi: boolean;
};
/**
 * If you sub class this class and have own constructor or property initialization you need
 * to provide the dependencies of this class manually.
 *
 *
 constructor(
 protected injector: Injector,
 protected cd: ChangeDetectorRef,
 @SkipSelf() protected cdParent: ChangeDetectorRef,
 ) {
        super(injector, cd, cdParent);
    }
 *
 */
export declare class ValueAccessorBase<T> implements ControlValueAccessor, OnDestroy {
    protected readonly injector: Injector;
    readonly cd: ChangeDetectorRef;
    readonly cdParent: ChangeDetectorRef;
    /**
     * @hidden
     */
    private _innerValue;
    /**
     * @hidden
     */
    readonly _changedCallback: ((value: T | undefined) => void)[];
    /**
     * @hidden
     */
    readonly _touchedCallback: (() => void)[];
    private _ngControl?;
    private _ngControlFetched;
    disabled?: boolean | '';
    get isDisabled(): boolean;
    valid?: boolean;
    get isValid(): boolean;
    error?: boolean;
    get isError(): boolean | null | undefined;
    required: boolean | '';
    readonly change: EventEmitter<T>;
    protected formComponent?: FormComponent;
    constructor(injector: Injector, cd: ChangeDetectorRef, cdParent: ChangeDetectorRef);
    get ngControl(): NgControl | undefined;
    /**
     * @hidden
     */
    setDisabledState(isDisabled: boolean): void;
    /**
     * @hidden
     */
    ngOnDestroy(): void;
    /**
     * @hidden
     */
    get innerValue(): T | undefined;
    /**
     * Sets the internal value and signals Angular's form and other users (that subscribed via registerOnChange())
     * that a change happened.
     *
     * @hidden
     */
    set innerValue(value: T | undefined);
    /**
     * Internal note: This method is called from outside. Either from Angular's form or other users.
     *
     * @hidden
     */
    writeValue(value?: T): void;
    /**
     * This method can be overwritten to get easily notified when innerValue has been changed, either
     * by outside or inside.
     *
     * @hidden
     */
    onInnerValueChange(): Promise<void>;
    /**
     * Call this method to signal Angular's form or other users that this widget has been touched.
     * @hidden
     */
    touch(): void;
    /**
     * @hidden
     */
    registerOnChange(fn: (value: T | undefined) => void): void;
    /**
     * @hidden
     */
    registerOnTouched(fn: () => void): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<ValueAccessorBase<any>, [null, null, { skipSelf: true; }]>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<ValueAccessorBase<any>, never, never, { "disabled": { "alias": "disabled"; "required": false; }; "valid": { "alias": "valid"; "required": false; }; "error": { "alias": "error"; "required": false; }; "required": { "alias": "required"; "required": false; }; }, { "change": "change"; }, never, never, true, never>;
}
