diff --git a/packages/conform-dom/form.ts b/packages/conform-dom/form.ts index e4c462dc..89b6d7f1 100644 --- a/packages/conform-dom/form.ts +++ b/packages/conform-dom/form.ts @@ -55,10 +55,7 @@ export type DefaultValue = Schema extends : Schema extends Array ? Array> | null | undefined : Schema extends Record - ? - | { [Key in keyof Combine]?: DefaultValue[Key]> } - | null - | undefined + ? { [Key in keyof Schema]?: DefaultValue } | null | undefined : string | null | undefined; export type FormValue = Schema extends @@ -77,9 +74,7 @@ export type FormValue = Schema extends : Schema extends Array ? string | Array> | undefined : Schema extends Record - ? - | { [Key in keyof Combine]?: DefaultValue[Key]> } - | undefined + ? { [Key in keyof Schema]?: FormValue } | null | undefined : unknown; const error = Symbol('error'); @@ -258,8 +253,7 @@ function createFormMeta( ): FormMeta { const lastResult = !initialized ? options.lastResult : undefined; const defaultValue = options.defaultValue - ? // @ts-expect-error - (serialize(options.defaultValue) as Record) + ? (serialize(options.defaultValue) as Record) : {}; const initialValue = lastResult?.initialValue ?? defaultValue; const result: FormMeta = { diff --git a/packages/conform-react/context.tsx b/packages/conform-react/context.tsx index 77ca260c..1322792c 100644 --- a/packages/conform-react/context.tsx +++ b/packages/conform-react/context.tsx @@ -82,16 +82,17 @@ type SubfieldMetadata< Schema, FormSchema extends Record, FormError, - CombinedSchema = Combine, -> = Exclude extends Array +> = [Schema] extends [Primitive] + ? {} + : [Schema] extends [Array | null | undefined] ? { getFieldList: () => Array>; } - : Exclude extends Record + : [Schema] extends [Record | null | undefined] ? { getFieldset: () => Required<{ - [Key in keyof CombinedSchema]: FieldMetadata< - CombinedSchema[Key], + [Key in keyof Combine]: FieldMetadata< + Combine[Key], FormSchema, FormError >; diff --git a/playground/app/routes/typing.tsx b/playground/app/routes/typing.tsx index 22e71d52..af3d8093 100644 --- a/playground/app/routes/typing.tsx +++ b/playground/app/routes/typing.tsx @@ -7,24 +7,28 @@ import { import { Form } from '@remix-run/react'; import { Playground } from '~/components'; -type Task = { content: string; completed: boolean }; +interface Task { + content: string; + completed: boolean; +} -type Rule = { +interface Rule { type: 'rule'; key: string; operator: string; value: string; -}; +} -type Group = { +interface Group { type: 'group'; conditions: Array; -}; +} type Schema = | { intent: 'foo'; tasks: Array; + date: Date; } | { intent: 'bar'; @@ -118,6 +122,15 @@ export default function Example() { // @ts-expect-error isFieldMetadataType1>(tasks); + const date = fields.date; + + isFieldMetadataType0(date); + isFieldMetadataType1(date); + isFieldMetadataType1(date); + + // @ts-expect-error + date.getFieldset(); + const tasksList = tasks.getFieldList(); isFieldMetadataType0(tasksList[0]);