Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 2c46d31

Browse files
Handle private/global React types, fixes #195 (#245)
1 parent a3885be commit 2c46d31

File tree

3 files changed

+112
-2
lines changed

3 files changed

+112
-2
lines changed

src/transform.js

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ const UnqualifiedReactTypeNameMap = {
151151
SyntheticPointerEvent: "PointerEvent",
152152
SyntheticTouchEvent: "TouchEvent",
153153
SyntheticTransitionEvent: "TransitionEvent",
154+
155+
// React$ElementType takes no type params, but React.ElementType takes one
156+
// optional type param
157+
React$ElementType: "ElementType",
154158
};
155159

156160
// Only types with different names are included.
@@ -159,7 +163,7 @@ const QualifiedReactTypeNameMap = {
159163
Text: "ReactText",
160164
Child: "ReactChild",
161165
Children: "ReactChildren",
162-
Element: "ReactElement",
166+
Element: "ReactElement", // 1:1 mapping is wrong, since ReactElement takes two type params
163167
Fragment: "ReactFragment",
164168
Portal: "ReactPortal",
165169
NodeArray: "ReactNodeArray",
@@ -578,7 +582,94 @@ const transform = {
578582
t.identifier(UnqualifiedReactTypeNameMap[typeName.name])
579583
),
580584
// TypeScript doesn't support empty type param lists
581-
typeParameters.params.length > 0 ? typeParameters : null
585+
typeParameters && typeParameters.params.length > 0
586+
? typeParameters
587+
: null
588+
)
589+
);
590+
return;
591+
}
592+
593+
if (typeName.name === "React$Node") {
594+
path.replaceWith(
595+
t.tsTypeReference(
596+
t.tsQualifiedName(t.identifier("React"), t.identifier("ReactNode"))
597+
)
598+
);
599+
return;
600+
}
601+
if (typeName.name === "React$Element") {
602+
// React$Element<T> -> React.ReactElement<React.ComponentProps<T>, T>
603+
path.replaceWith(
604+
t.tsTypeReference(
605+
t.tsQualifiedName(
606+
t.identifier("React"),
607+
t.identifier("ReactElement")
608+
),
609+
t.tsTypeParameterInstantiation([
610+
// React.ComponentProps<T>
611+
t.tsTypeReference(
612+
t.tsQualifiedName(
613+
t.identifier("React"),
614+
t.identifier("ComponentProps")
615+
),
616+
t.tsTypeParameterInstantiation([typeParameters.params[0]])
617+
),
618+
typeParameters.params[0],
619+
])
620+
)
621+
);
622+
return;
623+
}
624+
if (typeName.name === "React$Component") {
625+
// React$Component<Props, State> -> React.Component<Props, State>
626+
path.replaceWith(
627+
t.tsTypeReference(
628+
t.tsQualifiedName(t.identifier("React"), t.identifier("Component")),
629+
typeParameters
630+
)
631+
);
632+
return;
633+
}
634+
if (typeName.name === "React$ComponentType") {
635+
// React$ComponentType<Props> -> React.ComponentType<Props>
636+
path.replaceWith(
637+
t.tsTypeReference(
638+
t.tsQualifiedName(
639+
t.identifier("React"),
640+
t.identifier("ComponentType")
641+
),
642+
typeParameters
643+
)
644+
);
645+
return;
646+
}
647+
if (typeName.name === "React$Context") {
648+
// React$Context<T> -> React.Context<T>
649+
path.replaceWith(
650+
t.tsTypeReference(
651+
t.tsQualifiedName(t.identifier("React"), t.identifier("Context")),
652+
typeParameters
653+
)
654+
);
655+
return;
656+
}
657+
if (typeName.name === "React$Ref") {
658+
// React$Ref<T> -> React.Ref<T>
659+
path.replaceWith(
660+
t.tsTypeReference(
661+
t.tsQualifiedName(t.identifier("React"), t.identifier("Ref")),
662+
typeParameters
663+
)
664+
);
665+
return;
666+
}
667+
if (typeName.name === "React$StatelessFunctionalComponent") {
668+
// React$StatelessFunctionalComponent<Props> -> React.FC<Props>
669+
path.replaceWith(
670+
t.tsTypeReference(
671+
t.tsQualifiedName(t.identifier("React"), t.identifier("FC")),
672+
typeParameters
582673
)
583674
);
584675
return;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// @flow
2+
type A = React$Node;
3+
type B = React$Element<T>;
4+
type C = React$ElementType;
5+
type D = React$Component<Props>;
6+
type E = React$Component<Props, State>;
7+
type F = React$ComponentType<Props>;
8+
type G = React$Context<Props>;
9+
type H = React$Ref<Props>;
10+
type I = React$StatelessFunctionalComponent<Props>;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
type A = React.ReactNode;
2+
type B = React.ReactElement<React.ComponentProps<T>, T>;
3+
type C = React.ElementType;
4+
type D = React.Component<Props>;
5+
type E = React.Component<Props, State>;
6+
type F = React.ComponentType<Props>;
7+
type G = React.Context<Props>;
8+
type H = React.Ref<Props>;
9+
type I = React.FC<Props>;

0 commit comments

Comments
 (0)