@hookform/strictly-typed
Version:
React Hook Form strictly typed custom hooks.
63 lines (62 loc) • 4.12 kB
TypeScript
/// <reference types="react" />
import { FieldValues, Control, Message, ValidationRule, ValidateResult } from 'react-hook-form';
export declare type ArrayWithLength<N extends number> = {
[K in N]: any;
};
export interface DeepPathArray<TValues extends FieldValues, TPath> extends ReadonlyArray<string | number> {
['0']: keyof TValues;
['1']?: TPath extends {
['0']: infer K0;
} ? K0 extends keyof TValues ? keyof TValues[K0] : never : never;
['2']?: TPath extends {
['0']: infer K0;
['1']: infer K1;
} ? K0 extends keyof TValues ? K1 extends keyof TValues[K0] ? keyof TValues[K0][K1] : never : never : never;
['3']?: TPath extends {
['0']: infer K0;
['1']: infer K1;
['2']: infer K2;
} ? K0 extends keyof TValues ? K1 extends keyof TValues[K0] ? K2 extends keyof TValues[K0][K1] ? keyof TValues[K0][K1][K2] : never : never : never : never;
['4']?: TPath extends {
['0']: infer K0;
['1']: infer K1;
['2']: infer K2;
['3']: infer K3;
} ? K0 extends keyof TValues ? K1 extends keyof TValues[K0] ? K2 extends keyof TValues[K0][K1] ? K3 extends keyof TValues[K0][K1][K2] ? keyof TValues[K0][K1][K2][K3] : never : never : never : never : never;
['5']?: TPath extends {
['0']: infer K0;
['1']: infer K1;
['2']: infer K2;
['3']: infer K3;
['4']: infer K4;
} ? K0 extends keyof TValues ? K1 extends keyof TValues[K0] ? K2 extends keyof TValues[K0][K1] ? K3 extends keyof TValues[K0][K1][K2] ? K4 extends keyof TValues[K0][K1][K2][K3] ? keyof TValues[K0][K1][K2][K3][K4] : never : never : never : never : never : never;
}
export declare type DeepPathArrayValue<TValues extends FieldValues, TPath extends DeepPathArray<TValues, TPath>> = TPath extends ArrayWithLength<0 | 1 | 2 | 3 | 4 | 5 | 6> ? any : TPath extends ArrayWithLength<0 | 1 | 2 | 3 | 4 | 5> ? TValues[TPath[0]][TPath[1]][TPath[2]][TPath[3]][TPath[4]][TPath[5]] : TPath extends ArrayWithLength<0 | 1 | 2 | 3 | 4> ? TValues[TPath[0]][TPath[1]][TPath[2]][TPath[3]][TPath[4]] : TPath extends ArrayWithLength<0 | 1 | 2 | 3> ? TValues[TPath[0]][TPath[1]][TPath[2]][TPath[3]] : TPath extends ArrayWithLength<0 | 1 | 2> ? TValues[TPath[0]][TPath[1]][TPath[2]] : TPath extends ArrayWithLength<0 | 1> ? TValues[TPath[0]][TPath[1]] : TPath extends ArrayWithLength<0> ? TValues[TPath[0]] : never;
export declare type DeepPath<TValues extends FieldValues, TPath> = DeepPathArray<TValues, TPath> | keyof TValues;
export declare type DeepPathValue<TValues extends FieldValues, TPath extends DeepPath<TValues, TPath>> = TPath extends DeepPathArray<TValues, TPath> ? DeepPathArrayValue<TValues, TPath> : TPath extends keyof TValues ? TValues[TPath] : any;
export declare type Options<TControl extends Control> = {
control?: TControl;
};
export declare type Validate<TFieldValue> = (data: TFieldValue) => ValidateResult | Promise<ValidateResult>;
export declare type ValidationRules<TFieldValue> = Partial<{
required: Message | ValidationRule<boolean>;
min: ValidationRule<number | string>;
max: ValidationRule<number | string>;
maxLength: ValidationRule<number | string>;
minLength: ValidationRule<number | string>;
pattern: ValidationRule<RegExp>;
validate: Validate<TFieldValue> | Record<string, Validate<TFieldValue>>;
}>;
export declare type Assign<TValues extends object, U extends object> = TValues & Omit<U, keyof TValues>;
export declare type ControllerProps<TFieldValues extends FieldValues, TFieldName extends DeepPath<TFieldValues, TFieldName>, TAs extends 'input' | 'select' | 'textarea'> = Assign<{
name: TFieldName;
as?: TAs;
rules?: ValidationRules<DeepPathValue<TFieldValues, TFieldName>>;
onFocus?: () => void;
defaultValue?: DeepPathValue<TFieldValues, TFieldName>;
render?: (props: {
onChange: (...event: any[]) => void;
onBlur: () => void;
value: DeepPathValue<TFieldValues, TFieldName>;
}) => React.ReactElement;
}, JSX.IntrinsicElements[TAs]>;