@@ -4,22 +4,21 @@ import { Store } from '@tanstack/store'
44
55export type ValidationCause = 'change' | 'blur' | 'submit' | 'mount'
66
7- type ValidateFn < TData , TParentData , TName extends DeepKeys < TParentData > > = (
7+ type ValidateFn < TParentData , TName extends DeepKeys < TParentData > , TData > = (
88 value : TData ,
9- fieldApi : FieldApi < TData , TParentData , TName > ,
9+ fieldApi : FieldApi < TParentData , TName > ,
1010) => ValidationError
1111
1212type ValidateAsyncFn <
13- TData ,
1413 TParentData ,
1514 TName extends DeepKeys < TParentData > ,
15+ TData ,
1616> = (
1717 value : TData ,
18- fieldApi : FieldApi < TData , TParentData , TName > ,
18+ fieldApi : FieldApi < TParentData , TName > ,
1919) => ValidationError | Promise < ValidationError >
2020
2121export interface FieldOptions <
22- TData ,
2322 TParentData ,
2423 /**
2524 * This allows us to restrict the name to only be a valid field name while
@@ -29,41 +28,29 @@ export interface FieldOptions<
2928 /**
3029 * If TData is unknown, we can use the TName generic to determine the type
3130 */
32- TResolvedData = unknown extends TData ? DeepValue < TParentData , TName > : TData ,
31+ TData = DeepValue < TParentData , TName > ,
3332> {
3433 name : DeepKeys < TParentData >
35- index ?: TResolvedData extends any [ ] ? number : never
36- defaultValue ?: TResolvedData
34+ index ?: TData extends any [ ] ? number : never
35+ defaultValue ?: TData
3736 asyncDebounceMs ?: number
3837 asyncAlways ?: boolean
39- onMount ?: ( formApi : FieldApi < TResolvedData , TParentData , TName > ) => void
40- onChange ?: ValidateFn < TResolvedData , TParentData , TName >
41- onChangeAsync ?: ValidateAsyncFn < TResolvedData , TParentData , TName >
38+ onMount ?: ( formApi : FieldApi < TParentData , TName > ) => void
39+ onChange ?: ValidateFn < TParentData , TName , TData >
40+ onChangeAsync ?: ValidateAsyncFn < TParentData , TName , TData >
4241 onChangeAsyncDebounceMs ?: number
43- onBlur ?: ValidateFn < TResolvedData , TParentData , TName >
44- onBlurAsync ?: ValidateAsyncFn < TResolvedData , TParentData , TName >
42+ onBlur ?: ValidateFn < TParentData , TName , TData >
43+ onBlurAsync ?: ValidateAsyncFn < TParentData , TName , TData >
4544 onBlurAsyncDebounceMs ?: number
46- onSubmitAsync ?: ValidateAsyncFn < TResolvedData , TParentData , TName >
45+ onSubmitAsync ?: ValidateAsyncFn < TParentData , TName , TData >
4746 defaultMeta ?: Partial < FieldMeta >
4847}
4948
5049export interface FieldApiOptions <
51- TData ,
5250 TParentData ,
53- /**
54- * This allows us to restrict the name to only be a valid field name while
55- * also assigning it to a generic
56- */
5751 TName extends DeepKeys < TParentData > ,
58- /**
59- * If TData is unknown, we can use the TName generic to determine the type
60- */
61- TResolvedData extends ResolveData < TData , TParentData , TName > = ResolveData <
62- TData ,
63- TParentData ,
64- TName
65- > ,
66- > extends FieldOptions < TData , TParentData , TName , TResolvedData > {
52+ TData = DeepValue < TParentData , TName > ,
53+ > extends FieldOptions < TParentData , TName , TData > {
6754 form : FormApi < TParentData >
6855}
6956
@@ -82,34 +69,25 @@ export type FieldState<TData> = {
8269 meta : FieldMeta
8370}
8471
85- export type ResolveData < TData , TParentData , TName > = unknown extends TData
86- ? DeepValue < TParentData , TName >
87- : TData
88-
8972export type ResolveName < TParentData > = unknown extends TParentData
9073 ? string
9174 : DeepKeys < TParentData >
9275
9376export class FieldApi <
94- TData ,
9577 TParentData ,
9678 TName extends DeepKeys < TParentData > ,
97- TResolvedData extends ResolveData < TData , TParentData , TName > = ResolveData <
98- TData ,
99- TParentData ,
100- TName
101- > ,
79+ TData = DeepValue < TParentData , TName > ,
10280> {
10381 uid : number
104- form : FieldApiOptions < TData , TParentData , TName , TResolvedData > [ 'form' ]
82+ form : FieldApiOptions < TParentData , TName , TData > [ 'form' ]
10583 name ! : DeepKeys < TParentData >
106- options : FieldApiOptions < TData , TParentData , TName > = { } as any
107- store ! : Store < FieldState < TResolvedData > >
108- state ! : FieldState < TResolvedData >
109- prevState ! : FieldState < TResolvedData >
84+ options : FieldApiOptions < TParentData , TName > = { } as any
85+ store ! : Store < FieldState < TData > >
86+ state ! : FieldState < TData >
87+ prevState ! : FieldState < TData >
11088
11189 constructor (
112- opts : FieldApiOptions < TData , TParentData , TName , TResolvedData > & {
90+ opts : FieldApiOptions < TParentData , TName , TData > & {
11391 form : FormApi < TParentData >
11492 } ,
11593 ) {
@@ -123,7 +101,7 @@ export class FieldApi<
123101
124102 this . name = opts . name as any
125103
126- this . store = new Store < FieldState < TResolvedData > > (
104+ this . store = new Store < FieldState < TData > > (
127105 {
128106 value : this . getValue ( ) ,
129107 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
@@ -190,7 +168,7 @@ export class FieldApi<
190168 }
191169 }
192170
193- update = ( opts : FieldApiOptions < TResolvedData , TParentData , TName > ) => {
171+ update = ( opts : FieldApiOptions < TParentData , TName , TData > ) => {
194172 // Default Value
195173 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
196174 if ( this . state . value === undefined ) {
@@ -212,12 +190,12 @@ export class FieldApi<
212190 this . options = opts as never
213191 }
214192
215- getValue = ( ) : TResolvedData => {
193+ getValue = ( ) : TData => {
216194 return this . form . getFieldValue ( this . name ) as any
217195 }
218196
219197 setValue = (
220- updater : Updater < TResolvedData > ,
198+ updater : Updater < TData > ,
221199 options ?: { touch ?: boolean ; notify ?: boolean } ,
222200 ) => {
223201 this . form . setFieldValue ( this . name , updater as never , options )
@@ -241,13 +219,12 @@ export class FieldApi<
241219
242220 getInfo = ( ) => this . form . getFieldInfo ( this . name )
243221
244- pushValue = (
245- value : TResolvedData extends any [ ] ? TResolvedData [ number ] : never ,
246- ) => this . form . pushFieldValue ( this . name , value as any )
222+ pushValue = ( value : TData extends any [ ] ? TData [ number ] : never ) =>
223+ this . form . pushFieldValue ( this . name , value as any )
247224
248225 insertValue = (
249226 index : number ,
250- value : TResolvedData extends any [ ] ? TResolvedData [ number ] : never ,
227+ value : TData extends any [ ] ? TData [ number ] : never ,
251228 ) => this . form . insertFieldValue ( this . name , index , value as any )
252229
253230 removeValue = ( index : number ) => this . form . removeFieldValue ( this . name , index )
@@ -256,16 +233,11 @@ export class FieldApi<
256233 this . form . swapFieldValues ( this . name , aIndex , bIndex )
257234
258235 getSubField = <
259- TSubData ,
260- TSubName extends DeepKeys < TResolvedData > ,
261- TSubResolvedData extends ResolveData <
262- DeepValue < TResolvedData , TSubName > ,
263- TResolvedData ,
264- TSubName
265- > ,
236+ TSubName extends DeepKeys < TData > ,
237+ TSubData = DeepValue < TData , TSubName > ,
266238 > (
267239 name : TSubName ,
268- ) : FieldApi < TSubData , TResolvedData , TSubName , TSubResolvedData > =>
240+ ) : FieldApi < TData , TSubName , TSubData > =>
269241 new FieldApi ( {
270242 name : `${ this . name } .${ name } ` as never ,
271243 form : this . form ,
@@ -398,7 +370,7 @@ export class FieldApi<
398370
399371 validate = (
400372 cause : ValidationCause ,
401- value ?: TResolvedData ,
373+ value ?: TData ,
402374 ) : ValidationError [ ] | Promise < ValidationError [ ] > => {
403375 // If the field is pristine and validatePristine is false, do not validate
404376 if ( ! this . state . meta . isTouched ) return [ ]
@@ -416,7 +388,7 @@ export class FieldApi<
416388 return this . validateAsync ( value , cause )
417389 }
418390
419- handleChange = ( updater : Updater < TResolvedData > ) => {
391+ handleChange = ( updater : Updater < TData > ) => {
420392 this . setValue ( updater , { touch : true } )
421393 }
422394
0 commit comments