UNPKG

@hookform/strictly-typed

Version:

React Hook Form strictly typed custom hooks.

63 lines (62 loc) 4.12 kB
/// <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]>;