UNPKG

@frui.ts/helpers

Version:
27 lines (26 loc) 2.37 kB
import type { ArrayKey, BrowserNativeObject, IsTuple, Primitive, TupleKeys } from "./pathCommon"; export type FieldValues = Record<string, any>; type PathImpl<K extends string | number, V> = V extends Primitive | BrowserNativeObject ? `${K}` : `${K}` | `${K}.${Path<V>}`; export type Path<T> = T extends ReadonlyArray<infer V> ? IsTuple<T> extends true ? { [K in TupleKeys<T>]-?: PathImpl<K & string, T[K]>; }[TupleKeys<T>] : PathImpl<ArrayKey, V> : { [K in keyof T]-?: PathImpl<K & string, T[K]>; }[keyof T]; export type FieldPath<TFieldValues extends FieldValues> = Path<TFieldValues>; type ArrayPathImpl<K extends string | number, V> = V extends Primitive | BrowserNativeObject ? never : V extends ReadonlyArray<infer U> ? U extends Primitive | BrowserNativeObject ? never : `${K}` | `${K}.${ArrayPath<V>}` : `${K}.${ArrayPath<V>}`; export type ArrayPath<T> = T extends ReadonlyArray<infer V> ? IsTuple<T> extends true ? { [K in TupleKeys<T>]-?: ArrayPathImpl<K & string, T[K]>; }[TupleKeys<T>] : ArrayPathImpl<ArrayKey, V> : { [K in keyof T]-?: ArrayPathImpl<K & string, T[K]>; }[keyof T]; export type FieldArrayPath<TFieldValues extends FieldValues> = ArrayPath<TFieldValues>; export type PathValue<T, P extends Path<T> | ArrayPath<T>> = T extends any ? P extends `${infer K}.${infer R}` ? K extends keyof T ? R extends Path<T[K]> ? PathValue<T[K], R> : never : K extends `${ArrayKey}` ? T extends ReadonlyArray<infer V> ? PathValue<V, R & Path<V>> : never : never : P extends keyof T ? T[P] : P extends `${ArrayKey}` ? T extends ReadonlyArray<infer V> ? V : never : never : never; export type FieldPathValue<TFieldValues extends FieldValues, TFieldPath extends FieldPath<TFieldValues>> = PathValue<TFieldValues, TFieldPath>; export type FieldArrayPathValue<TFieldValues extends FieldValues, TFieldArrayPath extends FieldArrayPath<TFieldValues>> = PathValue<TFieldValues, TFieldArrayPath>; export type FieldPathValues<TFieldValues extends FieldValues, TPath extends FieldPath<TFieldValues>[] | readonly FieldPath<TFieldValues>[]> = {} & { [K in keyof TPath]: FieldPathValue<TFieldValues, TPath[K] & FieldPath<TFieldValues>>; }; export type FieldPathByValue<TFieldValues extends FieldValues, TValue> = { [Key in FieldPath<TFieldValues>]: FieldPathValue<TFieldValues, Key> extends TValue ? Key : never; }[FieldPath<TFieldValues>]; export {};