import { Signal, WritableSignal } from '@angular/core';
import { Observable } from 'rxjs';
import { Accessor } from '../../accessor/interface';
import { ValidatorError } from '../../errors/validator-error';
import { ArrayAccessors, ArrayItemAccessor } from '../../type-utils';
import { GetPropertyType } from '../../type-utils/get.types';
import { IValidator, ValidationUpdate } from '../../validation';
import { ValueValidation } from '../../validation/value-validation';
import { SignalProperties } from './interface';
export declare class SignalValueAccessor<TSignal extends WritableSignal<any>, TProperties extends SignalProperties<TSignal>, TProperty extends keyof TProperties> implements Accessor<TProperties, TProperties[TProperty]> {
    protected signalValue: TSignal;
    property: TProperty;
    options: {
        validators: {
            [key: string]: Array<IValidator>;
        };
        parentKeys: Array<string>;
        onDestroy: () => void;
        onIsDirty: (isDirty: boolean) => void;
        onValidationChange: (update: ValidationUpdate) => void;
        observable: Observable<{
            new: TProperties[TProperty];
            previous: TProperties[TProperty];
        }>;
        isEqual: (val1: unknown, val2: unknown) => boolean;
    };
    readonly id: string;
    readonly isDirty: WritableSignal<boolean>;
    readonly validation: ValueValidation<TProperties[TProperty]>;
    readonly isRequired: Signal<boolean>;
    readonly arrayAccessors: ArrayAccessors<TProperties[TProperty]>;
    readonly get: Signal<TProperties[TProperty]>;
    readonly errors: WritableSignal<Array<ValidatorError>>;
    protected readonly accessorMap: Map<string, Accessor<any, any>>;
    protected readonly dirtyMap: Map<string, boolean>;
    constructor(signalValue: TSignal, property: TProperty, options: {
        validators: {
            [key: string]: Array<IValidator>;
        };
        parentKeys: Array<string>;
        onDestroy: () => void;
        onIsDirty: (isDirty: boolean) => void;
        onValidationChange: (update: ValidationUpdate) => void;
        observable: Observable<{
            new: TProperties[TProperty];
            previous: TProperties[TProperty];
        }>;
        isEqual: (val1: unknown, val2: unknown) => boolean;
    });
    getAccessors(): TProperties[TProperty] extends Array<any> ? Array<Accessor<TProperties[TProperty], GetPropertyType<TProperties[TProperty], '0'>>> : never;
    getAccessKey(): string;
    getValidatorKey(): string;
    get$(): Observable<TProperties[TProperty]>;
    set(value: TProperties[TProperty]): void;
    access<Property extends keyof TProperties[TProperty]>(key: Property | number): Accessor<TProperties[TProperty], TProperties[TProperty][Property]>;
    setDirty(isDirty: boolean): void;
    setPristine(): void;
    destroy(): void;
    getValue(): TProperties[TProperty];
    protected setArrayAccessors(): void;
    protected updateValidation(): void;
    protected arrayAccessorsHaveChanged(): boolean;
    protected createItemAccessor(key: number | string): Accessor<TSignal, TProperties>;
    protected findItemAccessorIndex(item: any): number;
    protected findItemIndexForAccessor(accessor: ArrayItemAccessor<TProperties>): number;
    protected isEqual(val1: unknown, val2: unknown): boolean;
}
