import { Signal } from '@angular/core';
import { Observable } from 'rxjs';
import { ArrayAccessors } from '../type-utils';
import { IndicesOf } from '../type-utils/array.types';
import { ValueValidation } from '../validation/value-validation';
export interface Accessor<TProperties, TValueType> {
    readonly id: string;
    readonly isRequired: Signal<boolean>;
    readonly isDirty: Signal<boolean>;
    readonly property: keyof TProperties;
    readonly arrayAccessors: ArrayAccessors<TValueType>;
    readonly validation: ValueValidation<TValueType>;
    readonly get: Signal<TValueType>;
    getValue<Type extends TProperties[Property], Property extends keyof TProperties>(): TValueType;
    get$<Type extends TProperties[Property], Property extends keyof TProperties>(): Observable<TValueType>;
    set<Property extends keyof TProperties>(value: TValueType): void;
    access<Property extends keyof TValueType>(key: TValueType extends Array<any> ? IndicesOf<TValueType> : Property): Accessor<TValueType, TValueType[Property]>;
    getAccessors(): ArrayAccessors<TValueType>;
    getAccessKey(): string;
    destroy(): void;
    setDirty(isDirty: boolean): void;
    setPristine(): void;
}
