Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit faa9e0b

Browse files
committed
feat: Added arrayOf type props
1 parent f5d8cf7 commit faa9e0b

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed

Diff for: index.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,16 @@ function isNode(obj: any): boolean {
103103
}
104104

105105
function getReactPropTypeFromExpression(node: any): any {
106-
if (node.object.type == 'MemberExpression'
106+
if (node.type == 'MemberExpression' && node.object.type == 'MemberExpression'
107107
&& node.object.object.name == 'React' && node.object.property.name == 'PropTypes') {
108108
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+
}
109116
}
110117
return 'undefined';
111118
}
@@ -136,7 +143,8 @@ export function getTypeFromPropType(node: any): IProperty {
136143
result.type = 'any';
137144
break;
138145
case 'array':
139-
result.type = 'any[]';
146+
let arrayType: any = type.arrayType || {name: 'any'};
147+
result.type = arrayType.name + '[]';
140148
break;
141149
case 'bool':
142150
result.type = 'boolean';

Diff for: tests/parse-prop-types-test.ts

+28
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ describe('The PropType parser', () => {
5252
type: 'MemberExpression',
5353
loc: {},
5454
object: {
55+
type: 'MemberExpression',
5556
object: reactPropTypesMemberExpression,
5657
property: {
5758
name: 'func'
@@ -120,4 +121,31 @@ describe('The PropType parser', () => {
120121
};
121122
assert.deepEqual(getTypeFromPropType(ast), {type: 'React.ReactElement<any>', optional: true});
122123
});
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+
});
123151
});

Diff for: tests/simple-component.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ declare module 'simple-component' {
1212
optionalString?: string;
1313
optionalNode?: React.ReactNode;
1414
optionalElement?: React.ReactElement<any>;
15+
optionalArrayOf?: number[];
1516
requiredFunc: (...args: any[]) => any;
1617
requiredAny: any;
18+
requiredArrayOf: string[];
1719
}
1820

1921
export default class SimpleComponent extends React.Component<SimpleComponentProps, any> {

Diff for: tests/simple-component.jsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ export default class SimpleComponent extends React.Component {
1919
// React.PropTypes.number,
2020
// React.PropTypes.instanceOf(Message)
2121
//]),
22-
//optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
22+
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
2323
//optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
2424
//optionalObjectWithShape: React.PropTypes.shape({
2525
// color: React.PropTypes.string,
2626
// fontSize: React.PropTypes.number
2727
//}),
2828
requiredFunc: React.PropTypes.func.isRequired,
2929
requiredAny: React.PropTypes.any.isRequired,
30+
requiredArrayOf: React.PropTypes.arrayOf(React.PropTypes.string).isRequired,
3031
};
3132

3233
render() {

0 commit comments

Comments
 (0)