import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';
import type { AnyArray, AnyObject } from '@ngify/core';
import type { AbstractControlSchema, AbstractFormArraySchema, AbstractFormGroupSchema, AbstractSchema, SchemaKey } from '../schemas';
import type { Indexable } from '../types';
import * as i0 from "@angular/core";
export declare class FormUtil {
    private readonly schemaUtil;
    private readonly valueUtil;
    private readonly valueTransformer;
    createFormControl(schema: AbstractControlSchema, model: AnyObject): FormControl;
    createFormGroup(schema: AbstractFormGroupSchema, model: AnyObject): FormGroup;
    createFormGroup(schemas: Indexable<AbstractSchema>[], model: AnyObject): FormGroup;
    createFormGroup(schemaOrSchemas: AbstractFormGroupSchema | Indexable<AbstractSchema>[], model: AnyObject): FormGroup;
    private createControlMap;
    createFormArray(schema: AbstractFormArraySchema, model: AnyArray): FormArray;
    createFormArrayElements(schemas: Indexable<AbstractSchema>[], model: AnyArray): AbstractControl<any, any>[];
    createAnyControl(schema: AbstractControlSchema, model: AnyObject | AnyArray): AbstractControl;
    /**
     * Update the form state, currently includes:
     * - Updating validators
     * - Updating status - enabled / disabled
     * - Updating value
     * @param form
     * @param model
     * @param schemas
     */
    updateForm(form: FormGroup, model: AnyObject, schemas: AbstractSchema[]): void;
    updateForm(form: FormArray, model: AnyArray, schemas: AbstractSchema[]): void;
    /**
     * Assign value from form to model
     * @param model
     * @param form
     * @param schemas
     */
    updateModel(model: AnyObject, form: FormGroup, schemas: AbstractSchema[]): AnyObject;
    updateModel(model: AnyArray, form: FormArray, schemas: AbstractSchema[]): AnyArray;
    static ɵfac: i0.ɵɵFactoryDeclaration<FormUtil, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<FormUtil>;
}
/**
 * Automatically choose to use `.get()` or `.at()` to get a child control
 * based on the type of the form.
 * @param form
 * @param key
 * @returns
 */
export declare function getChildControl(form: FormGroup | FormArray, key: SchemaKey): AbstractControl | null;
