@@ -18,7 +18,7 @@ export type FieldProps<T extends object, K extends keyof T, C> = {
18
18
} ;
19
19
20
20
export function Field < T extends object , K extends keyof T , C extends React . FunctionComponent < any > | keyof JSX . IntrinsicElements = "input" > (
21
- props : FieldProps < T , K , C > & Omit < ElementProps < C > , "value" | "onChange" | keyof FieldProps < T , K , C > | keyof SerializeProps > & SerializeProps
21
+ props : FieldProps < T , K , C > & Omit < ElementProps < C > , "value" | "onChange" | keyof FieldProps < T , K , C > | keyof SerializeProps > & SerializeProps < T [ K ] >
22
22
) {
23
23
const { form, as = "input" , serializer, dateAsNumber, setNullOnUncheck, setUndefinedOnUncheck, deserializer, hideWhenNull, ...rest } = props ;
24
24
const serializeProps = {
@@ -32,16 +32,17 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
32
32
const onChange = useCallback (
33
33
( ev : any ) => {
34
34
let v = "target" in ev ? ( [ "checkbox" , "radio" ] . includes ( props . type ! ) ? ev . target . checked : ev . target . value ) : ev ;
35
- setValue ( ( deserializer ?? defaultDeserializer ) ( v , value , serializeProps ) ) ;
35
+ if ( typeof v === "string" || typeof v === "boolean" ) setValue ( ( deserializer ?? defaultDeserializer ) ( v , value , serializeProps ) ) ;
36
+ else setValue ( v ) ;
36
37
} ,
37
- [ setValue ]
38
+ [ setValue , props . type ]
38
39
) ;
39
40
if ( hideWhenNull && ( value === undefined || value === null ) ) return null ;
40
41
let v = ( serializer ?? defaultSerializer ) ( value , serializeProps ) ;
41
42
return React . createElement ( as , {
42
43
...rest ,
43
44
checked : typeof v === "boolean" ? v : undefined ,
44
- value : typeof v === "boolean" ? undefined : value ,
45
+ value : typeof v === "boolean" ? undefined : v ,
45
46
disabled : state . isSubmitting ,
46
47
onChange
47
48
} ) ;
@@ -73,10 +74,10 @@ export type SerializeProps<V = any> = {
73
74
setUndefinedOnUncheck ?: boolean ;
74
75
setNullOnUncheck ?: boolean ;
75
76
type ?: SerializeType ;
76
- value ?: V ;
77
+ value ?: V extends any [ ] ? V [ number ] : V ;
77
78
} ;
78
79
79
- export function defaultSerializer < T > ( currentValue : T , props : SerializeProps < T > ) : boolean | string {
80
+ function defaultSerializer < T > ( currentValue : T , props : SerializeProps < T > ) : boolean | string {
80
81
switch ( props . type ) {
81
82
case "datetime-local" :
82
83
case "date" : {
@@ -112,7 +113,7 @@ export function defaultSerializer<T>(currentValue: T, props: SerializeProps<T>):
112
113
}
113
114
}
114
115
115
- export function defaultDeserializer < T > ( inputValue : string | boolean , currentValue : T , props : SerializeProps < T > ) {
116
+ function defaultDeserializer < T > ( inputValue : string | boolean , currentValue : T , props : SerializeProps < T > ) {
116
117
switch ( props . type ) {
117
118
case "number" : {
118
119
return parseFloat ( inputValue as any ) ;
0 commit comments