Skip to content
This repository was archived by the owner on Sep 21, 2019. It is now read-only.

Commit a1de3a0

Browse files
committed
wip
1 parent 95f308b commit a1de3a0

File tree

7 files changed

+37
-16
lines changed

7 files changed

+37
-16
lines changed

src/transforms/collapse-intersection-interfaces-transform.ts

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as ts from 'typescript';
2+
import * as _ from 'lodash';
23

34
import * as helpers from '../helpers';
45

@@ -13,8 +14,8 @@ import * as helpers from '../helpers';
1314
* type Foo = {foo: string; bar: number;}
1415
*/
1516
export function collapseIntersectionInterfacesTransformFactoryFactory(
16-
typeChecker: ts.TypeChecker,
17-
): ts.TransformerFactory<ts.SourceFile> {
17+
typeChecker: ts.TypeChecker,
18+
): ts.TransformerFactory<ts.SourceFile> {
1819
return function collapseIntersectionInterfacesTransformFactory(context: ts.TransformationContext) {
1920
return function collapseIntersectionInterfacesTransform(sourceFile: ts.SourceFile) {
2021
const visited = ts.visitEachChild(sourceFile, visitor, context);
@@ -32,27 +33,47 @@ export function collapseIntersectionInterfacesTransformFactoryFactory(
3233

3334
function visitTypeAliasDeclaration(node: ts.TypeAliasDeclaration) {
3435
if (
35-
ts.isIntersectionTypeNode(node.type)
36-
&& node.type.types.every(ts.isTypeLiteralNode)
36+
ts.isIntersectionTypeNode(node.type) &&
37+
node.type.types.every(ts.isTypeLiteralNode) &&
38+
node.type.types.every(type => type.forEachChild(node => ts.isPropertySignature(node)) || false)
3739
) {
40+
// debugger
3841
// We need cast `node.type.types` to `ts.NodeArray<ts.TypeLiteralNode>`
3942
// because TypeScript can't figure out `node.type.types.every(ts.isTypeLiteralNode)`
40-
const allMembers = (node.type.types as ts.NodeArray<ts.TypeLiteralNode>)
41-
.map((type) => type.members)
42-
.reduce((all, members) => ts.createNodeArray(all.concat(members)), ts.createNodeArray([]));
43+
const allIntersectionTypeNodeTypes = node.type.types as ts.NodeArray<ts.TypeLiteralNode>;
44+
45+
// Flatten all members into an array
46+
const allMembersOfAllIntersectionTypeNode = allIntersectionTypeNodeTypes
47+
.map(typeLitteralNode => {
48+
return typeLitteralNode.members as ts.NodeArray<ts.PropertySignature>;
49+
})
50+
.reduce((result, members) => [...result, ...members], [] as Array<ts.PropertySignature>);
51+
// debugger
52+
// Dedupe members with exact same name and type ({ foo: string } & { foo: string })
53+
const dedupedMembers = _.uniqBy(allMembersOfAllIntersectionTypeNode, memeber => {
54+
// debugger
55+
return memeber.name && memeber.name.getText() + memeber.type;
56+
});
57+
58+
// const allMembers = (node.type.types as ts.NodeArray<ts.TypeLiteralNode>)
59+
// .map((type) => type.members)
60+
// .reduce((all, members) => ts.createNodeArray(all.concat(members)), ts.createNodeArray([]));
61+
62+
// const dedupedMembers = _.uniqBy(allMembers, (member)=> {
63+
// return member.getText(sourceFile) + '___' + typeChecker.getTypeFromTypeNode(member.)
64+
// })
4365

4466
return ts.createTypeAliasDeclaration(
4567
[],
4668
[],
4769
node.name.text,
4870
[],
49-
ts.createTypeLiteralNode(allMembers),
71+
ts.createTypeLiteralNode(dedupedMembers),
5072
);
5173
}
5274

5375
return node;
5476
}
55-
}
56-
}
77+
};
78+
};
5779
}
58-
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
type Foo = {};
1+
type Foo = {} & {};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
type A = { foo: string; } & { foo: string; };
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type A = {
2+
foo: string,
3+
};

test/end-to-end/initial-state-and-proprypes-and-set-state/output.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ type MyComponentProps = {
44
};
55
type MyComponentState = {
66
dynamicState: number,
7-
foo: number,
8-
bar: string,
97
};
108
export default class MyComponent extends React.Component<MyComponentProps, MyComponentState> {
119
state = { foo: 1, bar: 'str' };

test/end-to-end/initial-state-and-proprypes/output.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ type MyComponentProps = {
44
};
55
type MyComponentState = {
66
foo: number,
7-
bar: string,
87
};
98
export default class MyComponent extends React.Component<MyComponentProps, MyComponentState> {
109
state = { foo: 1, bar: 'str' };

test/end-to-end/multiple-components/output.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ const Hey: React.SFC<HeyProps> = ({ name }) => {
1212
};
1313
type MyComponentState = {
1414
foo: number,
15-
bar: number,
1615
};
1716
export default class MyComponent extends React.Component<{}, MyComponentState> {
1817
render() {

0 commit comments

Comments
 (0)