@@ -29,7 +29,11 @@ export class DecimalValidator extends NumberValidator implements DecimalValidato
2929 min ( min : number ) : this {
3030 return this . addRule ( {
3131 name : 'min' ,
32- test : ( value : number ) => value >= min ,
32+ test : ( value : number | null | undefined ) => {
33+ if ( typeof value !== 'number' )
34+ return false
35+ return value >= min
36+ } ,
3337 message : 'Must be at least {min}' ,
3438 params : { min } ,
3539 } )
@@ -38,7 +42,11 @@ export class DecimalValidator extends NumberValidator implements DecimalValidato
3842 max ( max : number ) : this {
3943 return this . addRule ( {
4044 name : 'max' ,
41- test : ( value : number ) => value <= max ,
45+ test : ( value : number | null | undefined ) => {
46+ if ( typeof value !== 'number' )
47+ return false
48+ return value <= max
49+ } ,
4250 message : 'Must be at most {max}' ,
4351 params : { max } ,
4452 } )
@@ -47,7 +55,11 @@ export class DecimalValidator extends NumberValidator implements DecimalValidato
4755 length ( length : number ) : this {
4856 return this . addRule ( {
4957 name : 'length' ,
50- test : ( value : number ) => value . toString ( ) . length === length ,
58+ test : ( value : number | null | undefined ) => {
59+ if ( typeof value !== 'number' )
60+ return false
61+ return value . toString ( ) . length === length
62+ } ,
5163 message : 'Must be exactly {length} digits' ,
5264 params : { length } ,
5365 } )
@@ -56,35 +68,59 @@ export class DecimalValidator extends NumberValidator implements DecimalValidato
5668 positive ( ) : this {
5769 return this . addRule ( {
5870 name : 'positive' ,
59- test : ( value : number ) => value > 0 ,
71+ test : ( value : number | null | undefined ) => {
72+ if ( typeof value !== 'number' )
73+ return false
74+ return value > 0
75+ } ,
6076 message : 'Must be a positive number' ,
6177 } )
6278 }
6379
6480 negative ( ) : this {
6581 return this . addRule ( {
6682 name : 'negative' ,
67- test : ( value : number ) => value < 0 ,
83+ test : ( value : number | null | undefined ) => {
84+ if ( typeof value !== 'number' )
85+ return false
86+ return value < 0
87+ } ,
6888 message : 'Must be a negative number' ,
6989 } )
7090 }
7191
7292 divisibleBy ( divisor : number ) : this {
7393 return this . addRule ( {
7494 name : 'divisibleBy' ,
75- test : ( value : number ) => isDivisibleBy ( String ( value ) , divisor ) ,
95+ test : ( value : number | null | undefined ) => {
96+ if ( typeof value !== 'number' )
97+ return false
98+ return isDivisibleBy ( String ( value ) , divisor )
99+ } ,
76100 message : 'Must be divisible by {divisor}' ,
77101 params : { divisor } ,
78102 } )
79103 }
80104
81- custom ( fn : ( value : number ) => boolean , message : string ) : this {
105+ custom ( fn : ( value : number | null | undefined ) => boolean , message : string ) : this {
82106 return this . addRule ( {
83107 name : 'custom' ,
84108 test : fn ,
85109 message,
86110 } )
87111 }
112+
113+ validate ( value : number | undefined | null ) : any {
114+ // Only allow actual numbers
115+ if ( typeof value !== 'number' || Number . isNaN ( value ) ) {
116+ const error = { message : 'This field is required' }
117+ return this . isPartOfShape
118+ ? { valid : false , errors : { [ this . fieldName ] : [ error ] } }
119+ : { valid : false , errors : [ error ] }
120+ }
121+ // Otherwise, use the base validation
122+ return super . validate ( value )
123+ }
88124}
89125
90126// Export a function to create decimal validators
0 commit comments