Skip to content

Commit a7a64ca

Browse files
committed
Display type parameters of reference types
1 parent bff8fc2 commit a7a64ca

File tree

7 files changed

+29
-23
lines changed

7 files changed

+29
-23
lines changed

src/parsers/componentParser.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,11 @@ import {
1212
} from '../models';
1313
import { ParserContext } from '../parser';
1414

15-
const componentReturnTypes = new Set([
16-
'Element',
17-
'ReactNode',
18-
'ReactElement',
19-
'JSX.Element',
20-
'React.JSX.Element',
21-
'React.ReactNode',
22-
'React.ReactElement',
23-
]);
15+
const componentReturnTypes = [/Element/, /ReactNode/, /ReactElement(<.*>)?/];
16+
17+
function isReactReturnType(type: ReferenceNode) {
18+
return componentReturnTypes.some((regex) => regex.test(type.name));
19+
}
2420

2521
export function augmentComponentNodes(nodes: ExportNode[], context: ParserContext): ExportNode[] {
2622
return nodes.map((node) => {
@@ -47,10 +43,10 @@ function hasReactNodeLikeReturnType(type: FunctionNode) {
4743
return type.callSignatures.some(
4844
(signature) =>
4945
(signature.returnValueType instanceof ReferenceNode &&
50-
componentReturnTypes.has(signature.returnValueType.name)) ||
46+
isReactReturnType(signature.returnValueType)) ||
5147
(signature.returnValueType instanceof UnionNode &&
5248
signature.returnValueType.types.some(
53-
(type) => type instanceof ReferenceNode && componentReturnTypes.has(type.name),
49+
(type) => type instanceof ReferenceNode && isReactReturnType(type),
5450
)),
5551
);
5652
}

src/parsers/typeResolver.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,18 @@ function getTypeName(type: ts.Type, checker: ts.TypeChecker): string {
292292
return checker.typeToString(type);
293293
}
294294

295-
const typeArguments = type.aliasTypeArguments?.map((x) => getTypeName(x, checker));
296-
if (typeArguments) {
295+
let typeArguments: string[] | undefined;
296+
if ('target' in type) {
297+
typeArguments = checker
298+
.getTypeArguments(type as ts.TypeReference)
299+
?.map((x) => getTypeName(x, checker));
300+
}
301+
302+
if (!typeArguments?.length) {
303+
typeArguments = type.aliasTypeArguments?.map((x) => getTypeName(x, checker)) ?? [];
304+
}
305+
306+
if (typeArguments && typeArguments.length > 0) {
297307
return `${typeName}<${typeArguments.join(', ')}>`;
298308
}
299309

test/hook-arrow-function/output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@
7676
"name": "externalProps",
7777
"type": {
7878
"kind": "reference",
79-
"name": "HTMLAttributes"
79+
"name": "HTMLAttributes<HTMLElement>"
8080
}
8181
}
8282
],
8383
"returnValueType": {
8484
"kind": "reference",
85-
"name": "HTMLAttributes"
85+
"name": "HTMLAttributes<HTMLElement>"
8686
}
8787
}
8888
]

test/hook-function-expression/output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@
7777
"name": "externalProps",
7878
"type": {
7979
"kind": "reference",
80-
"name": "HTMLAttributes"
80+
"name": "HTMLAttributes<HTMLElement>"
8181
}
8282
}
8383
],
8484
"returnValueType": {
8585
"kind": "reference",
86-
"name": "HTMLAttributes"
86+
"name": "HTMLAttributes<HTMLElement>"
8787
}
8888
}
8989
]

test/hook-function/output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@
7777
"name": "externalProps",
7878
"type": {
7979
"kind": "reference",
80-
"name": "HTMLAttributes"
80+
"name": "HTMLAttributes<HTMLElement>"
8181
}
8282
}
8383
],
8484
"returnValueType": {
8585
"kind": "reference",
86-
"name": "HTMLAttributes"
86+
"name": "HTMLAttributes<HTMLElement>"
8787
}
8888
}
8989
]

test/props-with-callbacks/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"name": "event",
2020
"type": {
2121
"kind": "reference",
22-
"name": "ChangeEvent"
22+
"name": "ChangeEvent<HTMLInputElement>"
2323
}
2424
}
2525
],

test/react-refs/output.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"name": "refObject",
1212
"type": {
1313
"kind": "reference",
14-
"name": "RefObject"
14+
"name": "RefObject<HTMLInputElement>"
1515
},
1616
"optional": false
1717
},
@@ -38,7 +38,7 @@
3838
"types": [
3939
{
4040
"kind": "reference",
41-
"name": "RefObject"
41+
"name": "RefObject<HTMLInputElement>"
4242
},
4343
{
4444
"kind": "intrinsic",
@@ -76,7 +76,7 @@
7676
},
7777
{
7878
"kind": "reference",
79-
"name": "RefObject"
79+
"name": "RefObject<HTMLInputElement | null>"
8080
},
8181
{
8282
"kind": "intrinsic",

0 commit comments

Comments
 (0)