@@ -12,9 +12,7 @@ export function getClassName(...args: any) {
12
12
return [ ...args ] . filter ( ( e ) => ! ! e ) . join ( " " ) ;
13
13
}
14
14
15
- export type FormInputCheckMode = "normal" | "setNull" | "setUndefined" ;
16
-
17
- export type FormInputType =
15
+ export type SerializeType =
18
16
| "number"
19
17
| "text"
20
18
| "password"
@@ -32,30 +30,21 @@ export type FormInputType =
32
30
| "tel"
33
31
| "range" ;
34
32
35
- export type Serializer < T extends object , K extends keyof T , State = DefaultState , Error extends string = string > = (
36
- currentValue : T [ K ] | T [ K ] [ keyof T [ K ] ] ,
37
- props : FormInputProps < T , K , State , Error >
38
- ) => boolean | string ;
33
+ export type Serializer < T > = ( currentValue : T , props : SerializeProps < T > ) => boolean | string ;
39
34
40
- export type Deserializer < T extends object , K extends keyof T , State = DefaultState , Error extends string = string > = (
41
- inputValue : string ,
42
- inputChecked : boolean ,
43
- currentValue : T [ K ] | T [ K ] [ keyof T [ K ] ] ,
44
- props : FormInputProps < T , K , State , Error >
45
- ) => T [ K ] | T [ K ] [ keyof T [ K ] ] ;
35
+ export type Deserializer < T > = ( inputValue : string , inputChecked : boolean , currentValue : T , props : SerializeProps < T > ) => T ;
46
36
47
- export type SerializeProps < T extends object , K extends keyof T > = {
37
+ export type SerializeProps < V > = {
48
38
dateAsNumber ?: boolean ;
49
39
setUndefinedOnUncheck ?: boolean ;
50
40
setNullOnUncheck ?: boolean ;
51
- type ?: FormInputType ;
52
- value ?: T [ K ] | T [ K ] [ keyof T [ K ] ] ;
41
+ type ?: SerializeType ;
42
+ value ?: V ;
53
43
} ;
54
44
55
- export function defaultSerializer < T extends object , K extends keyof T > (
56
- currentValue : T [ K ] | T [ K ] [ keyof T [ K ] ] ,
57
- props : SerializeProps < T , K >
58
- ) : boolean | string {
45
+ export type FormInputValue < T extends object , K extends keyof T > = T [ K ] extends any [ ] ? T [ K ] [ keyof T [ K ] ] : T [ K ] ;
46
+
47
+ export function defaultSerializer < T > ( currentValue : T , props : SerializeProps < T > ) : boolean | string {
59
48
switch ( props . type ) {
60
49
case "datetime-local" :
61
50
case "date" : {
@@ -92,12 +81,7 @@ export function defaultSerializer<T extends object, K extends keyof T>(
92
81
}
93
82
}
94
83
95
- export function defaultDeserializer < T extends object , K extends keyof T > (
96
- inputValue : string ,
97
- inputChecked : boolean ,
98
- currentValue : T [ K ] ,
99
- props : SerializeProps < T , K >
100
- ) {
84
+ export function defaultDeserializer < T > ( inputValue : string , inputChecked : boolean , currentValue : T , props : SerializeProps < T > ) {
101
85
switch ( props . type ) {
102
86
case "number" : {
103
87
return parseFloat ( inputValue ) as any ;
@@ -147,17 +131,15 @@ export function defaultDeserializer<T extends object, K extends keyof T>(
147
131
export type FormInputProps < T extends object , K extends keyof T = keyof T , State = DefaultState , Error extends string = string > = BaldInputProps & {
148
132
form : FormState < T , State , Error > ;
149
133
name : K ;
150
- type ?: FormInputType ;
151
- value ?: T [ K ] | T [ K ] [ keyof T [ K ] ] ;
152
- serializer ?: Serializer < T , K , State , Error > ;
153
- deserializer ?: Deserializer < T , K , State , Error > ;
134
+ serializer ?: Serializer < FormInputValue < T , K > > ;
135
+ deserializer ?: Deserializer < FormInputValue < T , K > > ;
154
136
errorClassName ?: string ;
155
137
errorStyle ?: React . CSSProperties ;
156
138
dirtyClassName ?: string ;
157
139
dirtyStyle ?: React . CSSProperties ;
158
140
disableOnSubmitting ?: boolean ;
159
141
hideWhenNull ?: boolean ;
160
- } & SerializeProps < T , K > ;
142
+ } & SerializeProps < FormInputValue < T , K > > ;
161
143
162
144
/**
163
145
* The builtin form input. You must always specify **form** and **name**. Use the **type** prop to specify what type of field it represents.
@@ -191,7 +173,7 @@ export function FormInput<T extends object, K extends keyof T, State extends Def
191
173
} = props ;
192
174
const { value : currentValue , error, dirty, state, setValue } = useListener ( form , name ) ;
193
175
194
- let valueChecked = ( serializer ?? defaultSerializer ) ( currentValue , props ) ;
176
+ let valueChecked = ( serializer ?? defaultSerializer ) ( currentValue as FormInputValue < T , K > , props ) ;
195
177
196
178
if ( process . env . NODE_ENV === "development" ) {
197
179
if ( ( setNullOnUncheck || setUndefinedOnUncheck ) && type !== "checkbox" )
@@ -212,7 +194,7 @@ export function FormInput<T extends object, K extends keyof T, State extends Def
212
194
value = { typeof valueChecked === "string" ? valueChecked : undefined }
213
195
checked = { typeof valueChecked === "boolean" ? valueChecked : undefined }
214
196
onChange = { ( ev ) => {
215
- setValue ( ( deserializer ?? defaultDeserializer ) ( ev . target . value , ev . target . checked , currentValue , props ) ) ;
197
+ setValue ( ( deserializer ?? defaultDeserializer ) ( ev . target . value , ev . target . checked , currentValue as FormInputValue < T , K > , props ) ) ;
216
198
} }
217
199
name = { name as string }
218
200
type = { type }
0 commit comments