Skip to content

Commit

Permalink
fix: Partial form types (#599)
Browse files Browse the repository at this point in the history
Co-authored-by: Aadit Olkar <[email protected]>
  • Loading branch information
SagnikPradhan and aadito123 authored Feb 17, 2024
1 parent ca0babe commit b28f6d8
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 11 deletions.
60 changes: 60 additions & 0 deletions packages/form-core/src/tests/FieldApi.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<FormValues>()

const field = new FieldApi({
form,
name: 'name' as const,
})

assertType<string | undefined>(field.state.value)
assertType<'name'>(field.options.name)
assertType<string | undefined>(field.getValue())
})

it('should type required fields in constructor', () => {
type FormValues = {
name: string
age?: number
}

const form = new FormApi<FormValues>({
defaultValues: {
name: 'test',
},
})

const field = new FieldApi({
form,
name: 'name' as const,
})

assertType<string>(field.state.value)
assertType<'name'>(field.options.name)
assertType<string>(field.getValue())
})

it('should type value properly for completely partial forms', () => {
type CompletelyPartialFormValues = {
name?: 'test'
age?: number
}

const form = new FormApi<CompletelyPartialFormValues>({
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: {
Expand Down
20 changes: 9 additions & 11 deletions packages/form-core/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -300,17 +300,15 @@ export type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5
? never
: unknown extends T
? string
: object extends T
? string
: T extends readonly any[] & IsTuple<T>
? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth>
: T extends any[]
? DeepKeys<T[number], [...TDepth, any]>
: T extends Date
? never
: T extends object
? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth>
: never
: T extends readonly any[] & IsTuple<T>
? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth>
: T extends any[]
? DeepKeysPrefix<T, number, TDepth>
: T extends Date
? never
: T extends object
? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth>
: never

type DeepKeysPrefix<
T,
Expand Down

0 comments on commit b28f6d8

Please sign in to comment.