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

Commit efb0fa8

Browse files
committed
feat: handle array props with shapes in extractComplexTypes
1 parent aa9a1ec commit efb0fa8

File tree

3 files changed

+37
-10
lines changed

3 files changed

+37
-10
lines changed

Diff for: src/typings.ts

+19-6
Original file line numberDiff line numberDiff line change
@@ -126,23 +126,25 @@ function extractComplexTypes(m: dom.ModuleDeclaration, interf: dom.InterfaceDecl
126126
if (member.kind === 'property' && isExtractableType(member.type)) {
127127
const name = `${componentName}${pascalCase(member.name)}`;
128128
const extractedMember = createModuleMember(name, member.type);
129-
extractedMember.flags = dom.DeclarationFlags.Export;
130-
m.members.push(extractedMember);
131-
member.type = dom.create.namedTypeReference(name);
129+
if (extractedMember) {
130+
extractedMember.flags = dom.DeclarationFlags.Export;
131+
m.members.push(extractedMember);
132+
member.type = createTypeReference(name, member.type);
133+
}
132134
}
133135
});
134136
}
135137

136-
type ExtractableType = dom.UnionType | dom.IntersectionType | dom.ObjectType;
138+
type ExtractableType = dom.UnionType | dom.IntersectionType | dom.ObjectType | dom.ArrayTypeReference;
137139

138140
function isExtractableType(type: dom.Type): type is ExtractableType {
139141
if (typeof type === 'object') {
140-
return ['union', 'intersection', 'object'].indexOf(type.kind) > -1;
142+
return ['union', 'intersection', 'object', 'array'].indexOf(type.kind) > -1;
141143
}
142144
return false;
143145
}
144146

145-
function createModuleMember(name: string, type: ExtractableType): dom.ModuleMember {
147+
function createModuleMember(name: string, type: ExtractableType): dom.ModuleMember | undefined {
146148
switch (type.kind) {
147149
case 'intersection':
148150
case 'union':
@@ -151,6 +153,17 @@ function createModuleMember(name: string, type: ExtractableType): dom.ModuleMemb
151153
const interf = dom.create.interface(name);
152154
interf.members = type.members;
153155
return interf;
156+
case 'array':
157+
return isExtractableType(type.type) ? createModuleMember(name, type.type) : undefined;
158+
}
159+
}
160+
161+
function createTypeReference(name: string, type: ExtractableType): dom.TypeReference {
162+
const namedTypeReference = dom.create.namedTypeReference(name);
163+
if (type.kind === 'array') {
164+
return dom.create.array(namedTypeReference);
165+
} else {
166+
return namedTypeReference;
154167
}
155168
}
156169

Diff for: tests/es6-class.d.ts

+13-4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@ declare module 'component' {
1414

1515
export type ComponentRequiredUnion = any[] | boolean;
1616

17+
export interface ComponentRequiredArrayOfObjectsWithShape {
18+
color?: string;
19+
fontSize?: number;
20+
}
21+
22+
export interface ComponentDeeplyNested {
23+
arrayInDeeplyNested?: {
24+
foo?: number;
25+
}[];
26+
}
27+
1728
export interface ComponentProps {
1829
/**
1930
* This is a jsdoc comment for optionalAny.
@@ -36,10 +47,8 @@ declare module 'component' {
3647
requiredAny: any;
3748
requiredUnion: ComponentRequiredUnion;
3849
requiredArrayOf: string[];
39-
requiredArrayOfObjectsWithShape: {
40-
color?: string;
41-
fontSize?: number;
42-
}[];
50+
requiredArrayOfObjectsWithShape: ComponentRequiredArrayOfObjectsWithShape[];
51+
deeplyNested: ComponentDeeplyNested[];
4352
requiredSymbol: typeof Symbol;
4453
}
4554

Diff for: tests/es6-class.jsx

+5
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,10 @@ Component.propTypes = {
4545
color: React.PropTypes.string,
4646
fontSize: React.PropTypes.number
4747
})).isRequired,
48+
deeplyNested: React.PropTypes.arrayOf(React.PropTypes.shape({
49+
arrayInDeeplyNested: React.PropTypes.arrayOf(React.PropTypes.shape({
50+
foo: React.PropTypes.number
51+
}))
52+
})).isRequired,
4853
requiredSymbol: React.PropTypes.symbol.isRequired,
4954
};

0 commit comments

Comments
 (0)