import type { FieldPath } from "react-hook-form"; import { expectTypeOf, it } from "vitest"; import type { FormFieldProps } from "./FormField"; import type { FormArrayPath, FormFieldArrayProps } from "./FormFieldArray"; interface Values { name: string; age: number; guests: { value: string }[]; tags: string[]; } type FieldValue> = Parameters< FormFieldProps["render"] >[0]["field"]["value"]; type ValidatedValue> = Parameters< Extract< NonNullable["validate"]>, (value: never, formValues: never) => unknown > >[0]; type ArrayItemName> = Parameters< FormFieldArrayProps["render"] >[0]["name"]; it("resolves a field's value type from its name, not from the whole form", () => { expectTypeOf>().toEqualTypeOf(); expectTypeOf>().toEqualTypeOf(); expectTypeOf>().toEqualTypeOf(); }); it("composes an array item's sub-path into a real field path", () => { expectTypeOf>().toEqualTypeOf<`guests.${number}`>(); expectTypeOf>().toEqualTypeOf(); }); it("admits arrays of primitives and types their item", () => { expectTypeOf>().toEqualTypeOf<"guests" | "tags">(); expectTypeOf< FormFieldArrayProps["emptyValue"] >().toEqualTypeOf<{ value: string }>(); expectTypeOf< FormFieldArrayProps["emptyValue"] >().toEqualTypeOf(); expectTypeOf>().toEqualTypeOf<`tags.${number}`>(); });