Skip to content

Commit 7aa9bb8

Browse files
authored
Merge pull request #1372 from stijnvanhulle/master
fix: better generic types for field, FormRenderer and hooks
2 parents 141a243 + 2998aab commit 7aa9bb8

File tree

4 files changed

+47
-31
lines changed

4 files changed

+47
-31
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { Validator } from "../validators";
1+
import { Validator } from '../validators';
22
import { ConditionDefinition } from '../condition';
3-
import { DataType } from "../data-types";
4-
import { AnyObject } from "../common-types/any-object";
5-
import { FieldInputProps } from "react-final-form";
6-
import { FormOptions } from "../renderer-context";
7-
import { Meta } from "../use-field-api";
3+
import { DataType } from '../data-types';
4+
import { AnyObject } from '../common-types/any-object';
5+
import { FieldInputProps } from 'react-final-form';
6+
import { FormOptions } from '../renderer-context';
7+
import { Meta } from '../use-field-api';
88

99
export type FieldAction = [string, ...any[]];
1010

@@ -17,20 +17,24 @@ export interface FieldApi<FieldValue, T extends HTMLElement = HTMLElement> {
1717
input: FieldInputProps<FieldValue, T>;
1818
}
1919

20-
export type ResolvePropsFunction = (props: AnyObject, fieldApi: FieldApi<any>, formOptions: FormOptions) => AnyObject;
20+
export type ResolvePropsFunction<FormValues = Record<string, any>, FieldValue = FormValues[keyof FormValues]> = (
21+
props: AnyObject,
22+
fieldApi: FieldApi<FieldValue>,
23+
formOptions: FormOptions<FormValues>
24+
) => AnyObject;
2125

22-
interface Field extends AnyObject {
26+
interface Field<FormValues = Record<string, any>, FieldValue = FormValues[keyof FormValues]> extends AnyObject {
2327
name: string;
2428
component: string;
2529
validate?: Validator[];
2630
condition?: ConditionDefinition | ConditionDefinition[];
2731
initializeOnMount?: boolean;
2832
dataType?: DataType;
29-
initialValue?: any;
30-
clearedValue?: any;
33+
initialValue?: FieldValue;
34+
clearedValue?: FieldValue;
3135
clearOnUnmount?: boolean;
3236
actions?: FieldActions;
33-
resolveProps?: ResolvePropsFunction;
37+
resolveProps?: ResolvePropsFunction<FormValues, FieldValue>;
3438
}
3539

3640
export default Field;
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,39 @@
1-
import { ComponentType, FunctionComponent, ReactNode } from 'react';
1+
import { ComponentType, ReactElement, FunctionComponent, ReactNode } from 'react';
22
import { FormProps } from 'react-final-form';
33
import Schema from '../common-types/schema';
44
import ComponentMapper from '../common-types/component-mapper';
5-
import { ValidatorMapper} from '../validator-mapper';
5+
import { ValidatorMapper } from '../validator-mapper';
66
import { ActionMapper } from './action-mapper';
77
import SchemaValidatorMapper from '../common-types/schema-validator-mapper';
88
import { FormTemplateRenderProps } from '../common-types/form-template-render-props';
99
import { AnyObject } from '../common-types/any-object';
1010

11-
export interface FormRendererProps extends Omit<FormProps, 'onSubmit'> {
12-
initialValues?: object;
13-
onCancel?: (values: AnyObject, ...args: any[]) => void;
11+
export interface FormRendererProps<
12+
FormValues = Record<string, any>,
13+
InitialFormValues = Partial<FormValues>,
14+
FormTemplateProps extends FormTemplateRenderProps = FormTemplateRenderProps
15+
> extends Omit<FormProps<FormValues, InitialFormValues>, 'onSubmit'> {
16+
initialValues?: InitialFormValues;
17+
onCancel?: (values: FormValues, ...args: any[]) => void;
1418
onReset?: () => void;
1519
onError?: (...args: any[]) => void;
16-
onSubmit?: FormProps['onSubmit']
20+
onSubmit?: FormProps<FormValues, InitialFormValues>['onSubmit'];
1721
schema: Schema;
1822
clearOnUnmount?: boolean;
1923
clearedValue?: any;
2024
componentMapper: ComponentMapper;
21-
FormTemplate?: ComponentType<FormTemplateRenderProps> | FunctionComponent<FormTemplateRenderProps>;
25+
FormTemplate?: ComponentType<FormTemplateProps> | FunctionComponent<FormTemplateProps>;
2226
validatorMapper?: ValidatorMapper;
2327
actionMapper?: ActionMapper;
2428
schemaValidatorMapper?: SchemaValidatorMapper;
25-
FormTemplateProps?: AnyObject;
26-
children?: ReactNode | ((props: FormTemplateRenderProps) => ReactNode)
29+
FormTemplateProps?: Partial<FormTemplateProps>;
30+
children?: ReactNode | ((props: FormTemplateRenderProps) => ReactNode);
2731
}
2832

29-
declare const FormRenderer: React.ComponentType<FormRendererProps>;
33+
declare function FormRenderer<
34+
FormValues = Record<string, any>,
35+
InitialFormValues = Partial<FormValues>,
36+
FormTemplateProps extends FormTemplateRenderProps = FormTemplateRenderProps
37+
>(props: FormRendererProps<FormValues, InitialFormValues, FormTemplateProps>): ReactElement<any, any>;
3038

3139
export default FormRenderer;

packages/react-form-renderer/src/renderer-context/renderer-context.d.ts

+10-9
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,21 @@ import Field from '../common-types/field';
77
import { AnyObject } from '../common-types/any-object';
88
import Schema from '../common-types/schema';
99

10-
export interface FormOptions extends FormApi {
11-
registerInputFile?: (name: string) => void;
12-
unRegisterInputFile?: (name: string) => void;
13-
onCancel?: (values: object, ...args: any[]) => void;
10+
export interface FormOptions<FormValues = Record<string, any>, InitialFormValues = Partial<FormValues>>
11+
extends FormApi<FormValues, InitialFormValues> {
12+
registerInputFile?: (name: keyof FormValues) => void;
13+
unRegisterInputFile?: (name: keyof FormValues) => void;
14+
onCancel?: (values: FormValues, ...args: any[]) => void;
1415
onReset?: () => void;
15-
handleSubmit: () => Promise<AnyObject | undefined> | undefined;
16+
handleSubmit: () => Promise<FormValues | undefined> | undefined;
1617
clearedValue?: any;
1718
renderForm: (fields: Field[]) => ReactNode[];
18-
internalRegisterField: (name: string) => void;
19-
internalUnregisterField: (name: string) => void;
19+
internalRegisterField: (name: keyof FormValues) => void;
20+
internalUnregisterField: (name: keyof FormValues) => void;
2021
getRegisteredFields: () => string[];
2122
ffGetRegisteredFields: () => string[];
22-
initialValues: AnyObject;
23-
schema: Schema,
23+
initialValues: InitialFormValues;
24+
schema: Schema;
2425
}
2526

2627
export interface RendererContextValue {
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
import { FormOptions } from '../renderer-context';
22

3-
export default function(): FormOptions;
3+
export default function useFormApi<FormValues = Record<string, any>, InitialFormValues = Partial<FormValues>>(): FormOptions<
4+
FormValues,
5+
InitialFormValues
6+
>;

0 commit comments

Comments
 (0)