Skip to content

Commit fd5cfc5

Browse files
committed
Merge branch 'main' into type-aliases
2 parents 5d3470d + ed86e3d commit fd5cfc5

File tree

4 files changed

+129
-10
lines changed

4 files changed

+129
-10
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "typescript-api-extractor",
3-
"version": "1.0.0-alpha.1",
3+
"version": "1.0.0-alpha.2",
44
"description": "Extracts API description from TypeScript code",
55
"author": {
66
"name": "Michał Dudak",

src/parsers/typeResolver.ts

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

250250
if (type.flags & ts.TypeFlags.Conditional) {
251-
// We don't fully support conditional types. We assume the condition is always true.
252-
if (
253-
type.aliasSymbol?.declarations?.[0] &&
254-
ts.isTypeAliasDeclaration(type.aliasSymbol.declarations[0]) &&
255-
ts.isConditionalTypeNode(type.aliasSymbol.declarations[0].type)
256-
) {
257-
const trueType = checker.getTypeFromTypeNode(
258-
type.aliasSymbol.declarations[0].type.trueType,
251+
const conditionalType = type as ts.ConditionalType;
252+
if (conditionalType.resolvedTrueType && conditionalType.resolvedFalseType) {
253+
return new UnionNode(
254+
undefined,
255+
[],
256+
[
257+
resolveType((type as ts.ConditionalType).resolvedTrueType!, context),
258+
resolveType((type as ts.ConditionalType).resolvedFalseType!, context),
259+
],
259260
);
260-
return resolveType(trueType, context);
261+
} else if (conditionalType.resolvedTrueType) {
262+
return resolveType(conditionalType.resolvedTrueType, context);
263+
} else if (conditionalType.resolvedFalseType) {
264+
return resolveType(conditionalType.resolvedFalseType, context);
261265
}
262266
}
263267

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)