@@ -3,26 +3,37 @@ type ObjectType<T> =
33 ? Record < string , any >
44 : Extract < T , Record < string , any > > ;
55
6+ type MappersType < T > = {
7+ boolean : T extends boolean
8+ ? ( value : boolean ) => Partial < ObjectType < T > >
9+ : never ;
10+ number : T extends number ? ( value : number ) => Partial < ObjectType < T > > : never ;
11+ object ?: ( value : Partial < ObjectType < T > > ) => Partial < ObjectType < T > > ;
12+ string : T extends string ? ( value : string ) => Partial < ObjectType < T > > : never ;
13+ } extends infer U
14+ ? { [ K in keyof U as U [ K ] extends never ? never : K ] : U [ K ] }
15+ : never ;
16+
17+ type IsObjectOnly < T > = T extends Record < string , any > | undefined
18+ ? Extract < T , string | boolean | number > extends never
19+ ? true
20+ : false
21+ : false ;
22+
623export type ValueToObject = <
724 T extends undefined | string | boolean | number | Record < string , any > ,
8- > ( args : {
9- defaultValue : ObjectType < T > ;
10- mappers : {
11- boolean : T extends boolean
12- ? ( value : boolean ) => Partial < ObjectType < T > >
13- : never ;
14- number : T extends number
15- ? ( value : number ) => Partial < ObjectType < T > >
16- : never ;
17- object ?: ( value : Partial < ObjectType < T > > ) => Partial < ObjectType < T > > ;
18- string : T extends string
19- ? ( value : string ) => Partial < ObjectType < T > >
20- : never ;
21- } extends infer U
22- ? { [ K in keyof U as U [ K ] extends never ? never : K ] : U [ K ] }
23- : never ;
24- value : T ;
25- } ) => ObjectType < T > ;
25+ > (
26+ args : {
27+ defaultValue : ObjectType < T > ;
28+ value : T ;
29+ } & ( IsObjectOnly < T > extends true
30+ ? {
31+ mappers ?: MappersType < T > ;
32+ }
33+ : {
34+ mappers : MappersType < T > ;
35+ } ) ,
36+ ) => ObjectType < T > ;
2637
2738const mergeResult = < T > (
2839 result : ObjectType < T > ,
@@ -45,28 +56,32 @@ export const valueToObject: ValueToObject = ({
4556
4657 switch ( typeof value ) {
4758 case 'boolean' :
48- if ( 'boolean' in mappers ) {
59+ if ( mappers && 'boolean' in mappers ) {
4960 const mapper = mappers . boolean as (
5061 value : boolean ,
5162 ) => Record < string , any > ;
5263 result = mergeResult ( result , mapper ( value ) ) ;
5364 }
5465 break ;
5566 case 'number' :
56- if ( 'number' in mappers ) {
67+ if ( mappers && 'number' in mappers ) {
5768 const mapper = mappers . number as ( value : number ) => Record < string , any > ;
5869 result = mergeResult ( result , mapper ( value ) ) ;
5970 }
6071 break ;
6172 case 'string' :
62- if ( 'string' in mappers ) {
73+ if ( mappers && 'string' in mappers ) {
6374 const mapper = mappers . string as ( value : string ) => Record < string , any > ;
6475 result = mergeResult ( result , mapper ( value ) ) ;
6576 }
6677 break ;
6778 case 'object' :
6879 if ( value !== null ) {
69- if ( 'object' in mappers && typeof mappers . object === 'function' ) {
80+ if (
81+ mappers &&
82+ 'object' in mappers &&
83+ typeof mappers . object === 'function'
84+ ) {
7085 const mapper = mappers . object as (
7186 value : Record < string , any > ,
7287 ) => Partial < ObjectType < any > > ;
0 commit comments