7
7
ValidateOptions ,
8
8
ValidateMessages ,
9
9
RuleObject ,
10
+ Rule ,
11
+ StoreValue ,
10
12
} from '../interface' ;
11
13
import NameMap from './NameMap' ;
12
14
import { containsNamePath , getNamePath , setValues } from './valueUtil' ;
@@ -16,7 +18,7 @@ import { defaultValidateMessages } from './messages';
16
18
* Replace with template.
17
19
* `I'm ${name}` + { name: 'bamboo' } = I'm bamboo
18
20
*/
19
- function replaceMessage ( template : string , kv : { [ name : string ] : any } ) : string {
21
+ function replaceMessage ( template : string , kv : Record < string , string > ) : string {
20
22
return template . replace ( / \$ \{ \w + \} / g, ( str : string ) => {
21
23
const key = str . slice ( 2 , - 1 ) ;
22
24
return kv [ key ] ;
@@ -27,20 +29,30 @@ function replaceMessage(template: string, kv: { [name: string]: any }): string {
27
29
* We use `async-validator` to validate rules. So have to hot replace the message with validator.
28
30
* { required: '${name} is required' } => { required: () => 'field is required' }
29
31
*/
30
- function convertMessages ( messages : ValidateMessages , name : string , rule : RuleObject ) {
31
- const kv : { [ name : string ] : any } = {
32
- ...rule ,
32
+ function convertMessages (
33
+ messages : ValidateMessages ,
34
+ name : string ,
35
+ rule : RuleObject ,
36
+ ) : ValidateMessages {
37
+ const kv = {
38
+ ...( rule as Record < string , string | number > ) ,
33
39
name,
34
40
enum : ( rule . enum || [ ] ) . join ( ', ' ) ,
35
41
} ;
36
42
37
- const replaceFunc = ( template : string , additionalKV ?: Record < string , any > ) => {
43
+ const replaceFunc = ( template : string , additionalKV ?: Record < string , string > ) => {
38
44
if ( ! template ) return null ;
39
45
return ( ) => replaceMessage ( template , { ...kv , ...additionalKV } ) ;
40
46
} ;
41
47
42
48
/* eslint-disable no-param-reassign */
43
- function fillTemplate ( source : { [ name : string ] : any } , target : { [ name : string ] : any } = { } ) {
49
+ type Template =
50
+ | {
51
+ [ name : string ] : string | ( ( ) => string ) | { [ name : string ] : Template } ;
52
+ }
53
+ | string ;
54
+
55
+ function fillTemplate ( source : Template , target : Template = { } ) {
44
56
Object . keys ( source ) . forEach ( ruleName => {
45
57
const value = source [ ruleName ] ;
46
58
if ( typeof value === 'string' ) {
@@ -57,12 +69,12 @@ function convertMessages(messages: ValidateMessages, name: string, rule: RuleObj
57
69
}
58
70
/* eslint-enable */
59
71
60
- return fillTemplate ( setValues ( { } , defaultValidateMessages , messages ) ) ;
72
+ return fillTemplate ( setValues ( { } , defaultValidateMessages , messages ) ) as ValidateMessages ;
61
73
}
62
74
63
75
async function validateRule (
64
76
name : string ,
65
- value : any ,
77
+ value : StoreValue ,
66
78
rule : RuleObject ,
67
79
options : ValidateOptions ,
68
80
) : Promise < string [ ] > {
@@ -78,7 +90,7 @@ async function validateRule(
78
90
[ name ] : [ cloneRule ] ,
79
91
} ) ;
80
92
81
- const messages = convertMessages ( options . validateMessages , name , cloneRule ) ;
93
+ const messages : ValidateMessages = convertMessages ( options . validateMessages , name , cloneRule ) ;
82
94
validator . messages ( messages ) ;
83
95
84
96
let result = [ ] ;
@@ -94,13 +106,13 @@ async function validateRule(
94
106
: message ) ,
95
107
) ;
96
108
} else {
97
- result = [ messages . default ( ) ] ;
109
+ result = [ ( messages . default as ( ( ) => string ) ) ( ) ] ;
98
110
}
99
111
}
100
112
101
113
if ( ! result . length && subRuleField ) {
102
114
const subResults : string [ ] [ ] = await Promise . all (
103
- value . map ( ( subValue : any , i : number ) =>
115
+ ( value as StoreValue [ ] ) . map ( ( subValue : StoreValue , i : number ) =>
104
116
validateRule ( `${ name } .${ i } ` , subValue , subRuleField , options ) ,
105
117
) ,
106
118
) ;
@@ -117,7 +129,7 @@ async function validateRule(
117
129
*/
118
130
export function validateRules (
119
131
namePath : InternalNamePath ,
120
- value : any ,
132
+ value : StoreValue ,
121
133
rules : RuleObject [ ] ,
122
134
options : ValidateOptions ,
123
135
) {
@@ -132,7 +144,7 @@ export function validateRules(
132
144
}
133
145
return {
134
146
...currentRule ,
135
- validator ( rule : any , val : any , callback : any ) {
147
+ validator ( rule : Rule , val : StoreValue , callback : ( error ?: string ) => void ) {
136
148
let hasPromise = false ;
137
149
138
150
// Wrap callback only accept when promise not provided
0 commit comments