import * as React from 'react';
import FieldProps, { FieldRenderProps } from './FieldProps';
import FormProps, { FormRenderProps } from './FormProps';
import FormSpyProps from './FormSpyProps';
import { FieldSpec, CreateField } from './createField';
import { ValueProperty, ParsedValueProperty } from './ExtractType';
export { FieldProps, FieldRenderProps, FormProps, FormRenderProps, FormSpyProps };
export declare type FormSpecBase = {
    [FieldName in string]: FieldSpec<any, any>;
};
export declare type GetFields<FormSpec extends FormSpecBase> = (createField: CreateField) => FormSpec;
export declare type Fields<FormData, ErrorValue> = {
    readonly [FieldName in keyof FormData]: React.ComponentType<FieldProps<FormData[FieldName], FieldName, FormData, ErrorValue>>;
};
export interface DefinedFormAPI<FormData, FormDataParsed, ErrorValue> {
    readonly Form: React.ComponentType<FormProps<FormData, FormDataParsed, ErrorValue>>;
    readonly Fields: {
        readonly [FieldName in keyof FormData]: React.ComponentType<FieldProps<FormData[FieldName], FieldName, FormData, ErrorValue>>;
    };
    readonly FormSpy: React.ComponentType<FormSpyProps<FormData, ErrorValue>>;
    extend<FormSpec extends FormSpecBase>(getFields: GetFields<FormSpec>): DefinedFormAPI<FormData & {
        [key in keyof FormSpec]: ValueProperty<FormSpec[key]>;
    }, FormDataParsed & {
        [key in keyof FormSpec]: ParsedValueProperty<FormSpec[key]>;
    }, ErrorValue>;
}
export default function defineForm<FormSpec extends FormSpecBase, ErrorValue = any>(getFields: GetFields<FormSpec>): DefinedFormAPI<{
    [key in keyof FormSpec]: ValueProperty<FormSpec[key]>;
}, {
    [key in keyof FormSpec]: ParsedValueProperty<FormSpec[key]>;
}, ErrorValue>;
