Skip to content

Commit b1652d7

Browse files
authored
Merge pull request #1 from michaldudak/conditional-types
Treat conditional types as unions
2 parents ff4c2e1 + 980a687 commit b1652d7

File tree

3 files changed

+128
-9
lines changed

3 files changed

+128
-9
lines changed

src/parsers/typeResolver.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -238,16 +238,20 @@ export function resolveType(
238238
}
239239

240240
if (type.flags & ts.TypeFlags.Conditional) {
241-
// We don't fully support conditional types. We assume the condition is always true.
242-
if (
243-
type.aliasSymbol?.declarations?.[0] &&
244-
ts.isTypeAliasDeclaration(type.aliasSymbol.declarations[0]) &&
245-
ts.isConditionalTypeNode(type.aliasSymbol.declarations[0].type)
246-
) {
247-
const trueType = checker.getTypeFromTypeNode(
248-
type.aliasSymbol.declarations[0].type.trueType,
241+
const conditionalType = type as ts.ConditionalType;
242+
if (conditionalType.resolvedTrueType && conditionalType.resolvedFalseType) {
243+
return new UnionNode(
244+
undefined,
245+
[],
246+
[
247+
resolveType((type as ts.ConditionalType).resolvedTrueType!, '', context),
248+
resolveType((type as ts.ConditionalType).resolvedFalseType!, '', context),
249+
],
249250
);
250-
return resolveType(trueType, name, context);
251+
} else if (conditionalType.resolvedTrueType) {
252+
return resolveType(conditionalType.resolvedTrueType, '', context);
253+
} else if (conditionalType.resolvedFalseType) {
254+
return resolveType(conditionalType.resolvedFalseType, '', context);
251255
}
252256
}
253257

test/conditional-types/input.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export function fn<T extends boolean>(x: T): T extends true ? number : null {
2+
return (x ? 1 : null) as T extends true ? number : null;
3+
}
4+
5+
export function Component1<Multiple extends boolean>(props: Props<Multiple>) {
6+
return null;
7+
}
8+
9+
interface Props<Multiple extends boolean> {
10+
value: Multiple extends true ? string | null : string[];
11+
}

test/conditional-types/output.json

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
{
2+
"name": "test/conditional-types/input",
3+
"exports": [
4+
{
5+
"name": "fn",
6+
"type": {
7+
"kind": "function",
8+
"name": "fn",
9+
"parentNamespaces": [],
10+
"callSignatures": [
11+
{
12+
"parameters": [
13+
{
14+
"type": {
15+
"kind": "typeParameter",
16+
"name": "T",
17+
"parentNamespaces": [],
18+
"constraint": "boolean"
19+
},
20+
"name": "x",
21+
"optional": false
22+
}
23+
],
24+
"returnValueType": {
25+
"kind": "union",
26+
"types": [
27+
{
28+
"kind": "intrinsic",
29+
"parentNamespaces": [],
30+
"name": "number"
31+
},
32+
{
33+
"kind": "intrinsic",
34+
"parentNamespaces": [],
35+
"name": "null"
36+
}
37+
],
38+
"parentNamespaces": []
39+
}
40+
}
41+
]
42+
}
43+
},
44+
{
45+
"name": "Component1",
46+
"type": {
47+
"kind": "function",
48+
"name": "Component1",
49+
"parentNamespaces": [],
50+
"callSignatures": [
51+
{
52+
"parameters": [
53+
{
54+
"type": {
55+
"kind": "object",
56+
"name": "Props",
57+
"parentNamespaces": [],
58+
"properties": [
59+
{
60+
"name": "value",
61+
"type": {
62+
"kind": "union",
63+
"types": [
64+
{
65+
"kind": "intrinsic",
66+
"parentNamespaces": [],
67+
"name": "string"
68+
},
69+
{
70+
"kind": "array",
71+
"parentNamespaces": [],
72+
"elementType": {
73+
"kind": "intrinsic",
74+
"parentNamespaces": [],
75+
"name": "string"
76+
}
77+
},
78+
{
79+
"kind": "intrinsic",
80+
"parentNamespaces": [],
81+
"name": "null"
82+
}
83+
],
84+
"parentNamespaces": []
85+
},
86+
"optional": false
87+
}
88+
]
89+
},
90+
"name": "props",
91+
"optional": false
92+
}
93+
],
94+
"returnValueType": {
95+
"kind": "intrinsic",
96+
"parentNamespaces": [],
97+
"name": "null"
98+
}
99+
}
100+
]
101+
}
102+
}
103+
]
104+
}

0 commit comments

Comments
 (0)