This repository was archived by the owner on Nov 27, 2023. It is now read-only.
File tree 4 files changed +42
-3
lines changed
4 files changed +42
-3
lines changed Original file line number Diff line number Diff line change @@ -103,9 +103,16 @@ function isNode(obj: any): boolean {
103
103
}
104
104
105
105
function getReactPropTypeFromExpression ( node : any ) : any {
106
- if ( node . object . type == 'MemberExpression'
106
+ if ( node . type == 'MemberExpression' && node . object . type == 'MemberExpression'
107
107
&& node . object . object . name == 'React' && node . object . property . name == 'PropTypes' ) {
108
108
return node . property ;
109
+ } else if ( node . type == 'CallExpression' ) {
110
+ if ( getReactPropTypeFromExpression ( node . callee ) . name == 'arrayOf' ) {
111
+ return {
112
+ name : 'array' ,
113
+ arrayType : getReactPropTypeFromExpression ( node . arguments [ 0 ] )
114
+ } ;
115
+ }
109
116
}
110
117
return 'undefined' ;
111
118
}
@@ -136,7 +143,8 @@ export function getTypeFromPropType(node: any): IProperty {
136
143
result . type = 'any' ;
137
144
break ;
138
145
case 'array' :
139
- result . type = 'any[]' ;
146
+ let arrayType : any = type . arrayType || { name : 'any' } ;
147
+ result . type = arrayType . name + '[]' ;
140
148
break ;
141
149
case 'bool' :
142
150
result . type = 'boolean' ;
Original file line number Diff line number Diff line change @@ -52,6 +52,7 @@ describe('The PropType parser', () => {
52
52
type : 'MemberExpression' ,
53
53
loc : { } ,
54
54
object : {
55
+ type : 'MemberExpression' ,
55
56
object : reactPropTypesMemberExpression ,
56
57
property : {
57
58
name : 'func'
@@ -120,4 +121,31 @@ describe('The PropType parser', () => {
120
121
} ;
121
122
assert . deepEqual ( getTypeFromPropType ( ast ) , { type : 'React.ReactElement<any>' , optional : true } ) ;
122
123
} ) ;
124
+ it ( 'should return number[] for arrayOf(React.PropTypes.number) prop types' , ( ) => {
125
+ const ast : any = {
126
+ type : 'CallExpression' ,
127
+ loc : { } ,
128
+ callee : {
129
+ type : 'MemberExpression' ,
130
+ loc : { } ,
131
+ object : reactPropTypesMemberExpression ,
132
+ property : {
133
+ name : 'arrayOf'
134
+ }
135
+ } ,
136
+ arguments : [
137
+ {
138
+ type : 'MemberExpression' ,
139
+ loc : { } ,
140
+ object : reactPropTypesMemberExpression ,
141
+ property : {
142
+ name : 'number'
143
+ }
144
+ }
145
+ ]
146
+ } ;
147
+ const result : any = getTypeFromPropType ( ast ) ;
148
+ assert . equal ( result . type , 'number[]' ) ;
149
+ assert . equal ( result . optional , true ) ;
150
+ } ) ;
123
151
} ) ;
Original file line number Diff line number Diff line change @@ -12,8 +12,10 @@ declare module 'simple-component' {
12
12
optionalString ?: string ;
13
13
optionalNode ?: React . ReactNode ;
14
14
optionalElement ?: React . ReactElement < any > ;
15
+ optionalArrayOf ?: number [ ] ;
15
16
requiredFunc : ( ...args : any [ ] ) => any ;
16
17
requiredAny : any ;
18
+ requiredArrayOf : string [ ] ;
17
19
}
18
20
19
21
export default class SimpleComponent extends React . Component < SimpleComponentProps , any > {
Original file line number Diff line number Diff line change @@ -19,14 +19,15 @@ export default class SimpleComponent extends React.Component {
19
19
// React.PropTypes.number,
20
20
// React.PropTypes.instanceOf(Message)
21
21
//]),
22
- // optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
22
+ optionalArrayOf : React . PropTypes . arrayOf ( React . PropTypes . number ) ,
23
23
//optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
24
24
//optionalObjectWithShape: React.PropTypes.shape({
25
25
// color: React.PropTypes.string,
26
26
// fontSize: React.PropTypes.number
27
27
//}),
28
28
requiredFunc : React . PropTypes . func . isRequired ,
29
29
requiredAny : React . PropTypes . any . isRequired ,
30
+ requiredArrayOf : React . PropTypes . arrayOf ( React . PropTypes . string ) . isRequired ,
30
31
} ;
31
32
32
33
render ( ) {
You can’t perform that action at this time.
0 commit comments