@@ -47,8 +47,7 @@ export function createTypings(moduleName: string|null, programAst: any, options:
4747 }
4848 componentNames . forEach ( componentName => {
4949 const exportType = getComponentExportType ( ast , componentName ) ;
50- const propTypes = getPropTypesFromAssignment ( ast , componentName ) ||
51- getPropTypesFromStaticAttribute ( ast , componentName ) ;
50+ const propTypes = getPropTypes ( ast , componentName ) ;
5251 if ( exportType ) {
5352 createExportedTypes ( m , ast , componentName , reactComponentName , propTypes , propTypesName , exportType , options ) ;
5453 }
@@ -344,6 +343,18 @@ function getComponentNamesByJsxInBody(ast: AstQuery): string[] {
344343 return [ ] ;
345344}
346345
346+ function getPropTypes ( ast : AstQuery , componentName : string ) : any | undefined {
347+ const propTypes = getPropTypesFromAssignment ( ast , componentName ) ||
348+ getPropTypesFromStaticAttribute ( ast , componentName ) ;
349+
350+ const referencedComponentName = getReferencedPropTypesComponentName ( ast , propTypes ) ;
351+ if ( referencedComponentName ) {
352+ return getPropTypes ( ast , referencedComponentName ) ;
353+ }
354+
355+ return propTypes ;
356+ }
357+
347358function getPropTypesFromAssignment ( ast : AstQuery , componentName : string ) : any | undefined {
348359 const res = ast . query ( `
349360 //AssignmentExpression[
@@ -389,6 +400,20 @@ function getPropTypesFromStaticAttribute(ast: AstQuery, componentName: string):
389400 return undefined ;
390401}
391402
403+ function getReferencedPropTypesComponentName ( ast : AstQuery , propTypes : any | undefined ) : string | undefined {
404+ if ( propTypes ) {
405+ const propTypesReference = ast . querySubtree ( propTypes , `
406+ MemberExpression [
407+ /:property Identifier[@name == 'propTypes']
408+ ] /:object Identifier
409+ ` ) ;
410+ if ( propTypesReference . length > 0 ) {
411+ return propTypesReference [ 0 ] . name ;
412+ }
413+ }
414+ return undefined ;
415+ }
416+
392417function getComponentExportType ( ast : AstQuery , componentName : string ) : dom . DeclarationFlags | undefined {
393418 if ( componentName === '' ) {
394419 // case: unnamed default export
0 commit comments