From b28f6d872a4a6f578498175213ebeb18aaad4fcf Mon Sep 17 00:00:00 2001 From: Sagnik Pradhan Date: Sat, 17 Feb 2024 18:23:01 +0530 Subject: [PATCH] fix: Partial form types (#599) Co-authored-by: Aadit Olkar <63646058+aadito123@users.noreply.github.com> --- .../form-core/src/tests/FieldApi.test-d.ts | 60 +++++++++++++++++++ packages/form-core/src/utils.ts | 20 +++---- 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/packages/form-core/src/tests/FieldApi.test-d.ts b/packages/form-core/src/tests/FieldApi.test-d.ts index bd4c55f78..2daee12d5 100644 --- a/packages/form-core/src/tests/FieldApi.test-d.ts +++ b/packages/form-core/src/tests/FieldApi.test-d.ts @@ -19,6 +19,66 @@ it('should type value properly', () => { assertType<'test'>(field.getValue()) }) +it('should type value when nothing is passed into constructor', () => { + type FormValues = { + name?: string + age?: number + } + + const form = new FormApi() + + const field = new FieldApi({ + form, + name: 'name' as const, + }) + + assertType(field.state.value) + assertType<'name'>(field.options.name) + assertType(field.getValue()) +}) + +it('should type required fields in constructor', () => { + type FormValues = { + name: string + age?: number + } + + const form = new FormApi({ + defaultValues: { + name: 'test', + }, + }) + + const field = new FieldApi({ + form, + name: 'name' as const, + }) + + assertType(field.state.value) + assertType<'name'>(field.options.name) + assertType(field.getValue()) +}) + +it('should type value properly for completely partial forms', () => { + type CompletelyPartialFormValues = { + name?: 'test' + age?: number + } + + const form = new FormApi({ + defaultValues: {}, + }) + + const field = new FieldApi({ + form, + name: 'name' as const, + }) + + assertType<'test' | undefined>(field.state.value) + assertType<'name'>(field.options.name) + assertType<'test' | undefined>(field.getValue()) +}) + it('should type onChange properly', () => { const form = new FormApi({ defaultValues: { diff --git a/packages/form-core/src/utils.ts b/packages/form-core/src/utils.ts index db2909687..fb7cf3196 100644 --- a/packages/form-core/src/utils.ts +++ b/packages/form-core/src/utils.ts @@ -300,17 +300,15 @@ export type DeepKeys = TDepth['length'] extends 5 ? never : unknown extends T ? string - : object extends T - ? string - : T extends readonly any[] & IsTuple - ? AllowedIndexes | DeepKeysPrefix, TDepth> - : T extends any[] - ? DeepKeys - : T extends Date - ? never - : T extends object - ? (keyof T & string) | DeepKeysPrefix - : never + : T extends readonly any[] & IsTuple + ? AllowedIndexes | DeepKeysPrefix, TDepth> + : T extends any[] + ? DeepKeysPrefix + : T extends Date + ? never + : T extends object + ? (keyof T & string) | DeepKeysPrefix + : never type DeepKeysPrefix< T,