type VoidFunction = () => void type ValidationRule = { errorMessage: string, validate(value: T): boolean } type Field = { value: T, label?: string, isRequired: TRequired, hasChange: boolean, placeholder?: string, errorMessage: string, onBlur: VoidFunction, resetState: VoidFunction, validate: VoidFunction, children?: Array>, hasError: boolean, validateOnSubmit(): string, onChangeValue(newValue: T): void, submitParser?(value: T): T, setError(errorMessage: string): void } type ChildrenField = Field & { key: string } export type FieldConfig = { label?: string, initialValue: T, isRequired: Required, placeholder?: string, validateOnBlur?: boolean, validationRules?: Array>, liveParser?(value: T): T, submitParser?(value: T): T } export type ChildrenFieldConfig = FieldConfig & { key: string } // ...args: Array - otherwise typescript throws an error when we pass parameters into config function export type InferForm) => Record | undefined>> = { [K in keyof ReturnType]: RequiredFieldValue, K> } type FieldValue = T[K] extends Field ? F : never type RequiredFieldValue = T[K] extends Field ? T[K] extends Field ? NonNullable : F : never type UseFormReturn | undefined>> = { // If we are using dynamic form we need that Partial to be able to access any key of the form form: T & Partial>>, hasError: boolean, isFilled: boolean, isValid: boolean, resetForm: VoidFunction, submit: VoidFunction, validateAll(): boolean, formHasChanges(): boolean, setError(field: string, errorMessage: string): void, setFieldValue(field: K, value: K extends keyof T ? FieldValue : any): void, setFieldInitialValue(field: K, value: K extends keyof T ? FieldValue : any): void, addFields(fields: Array>): void, removeFieldIds(fields: Array): void } type FormGateCallbacks = { onSuccess(form: {[K in keyof T]: RequiredFieldValue}): void, onError?(form: Record): void } declare function useForm | undefined>>( formFields: T, callbacks: FormGateCallbacks ): UseFormReturn declare function useField(props: FieldConfig): Field export { useForm, useField, Field, UseFormReturn }