Skip to content

Commit 53fa22e

Browse files
committed
Avoid including defaulted type arguments
Resolves #2820
1 parent b9177b4 commit 53fa22e

File tree

6 files changed

+39
-22
lines changed

6 files changed

+39
-22
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ title: Changelog
88

99
- `@include` and `@includeCode` now work in the readme file, #2814.
1010
- TypeDoc will now avoid making references to references, #2811.
11+
- Improved type reference conversion to avoid including defaulted type arguments, #2820.
1112
- Improved link resolution logic to prioritize type alias properties with the
1213
same symbol over type literal properties within function parameters.
1314

src/lib/converter/types.ts

+20-6
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import {
3838
createSignature,
3939
} from "./factories/signature.js";
4040
import { convertSymbol } from "./symbols.js";
41-
import { isObjectType } from "./utils/nodes.js";
41+
import { isObjectType, isTypeReference } from "./utils/nodes.js";
4242
import { removeUndefined } from "./utils/reflections.js";
4343
import type { TranslatedString } from "../internationalization/internationalization.js";
4444

@@ -813,6 +813,7 @@ const referenceConverter: TypeConverter<
813813
context,
814814
name,
815815
);
816+
816817
if (type.flags & ts.TypeFlags.Substitution) {
817818
// NoInfer<T>
818819
ref.typeArguments = [
@@ -823,11 +824,24 @@ const referenceConverter: TypeConverter<
823824
convertType(context, (type as ts.StringMappingType).type),
824825
];
825826
} else {
826-
ref.typeArguments = (
827-
type.aliasSymbol
828-
? type.aliasTypeArguments
829-
: (type as ts.TypeReference).typeArguments
830-
)?.map((ref) => convertType(context, ref));
827+
// Default type arguments are filled with a reference to the default
828+
// type. As TS doesn't support specifying earlier defaults, we know
829+
// that this will only filter out type arguments which aren't specified
830+
// by the user.
831+
let ignoredArgs: ts.Type[] | undefined;
832+
if (isTypeReference(type)) {
833+
ignoredArgs = type.target.typeParameters
834+
?.map((p) => p.getDefault())
835+
.filter((x) => !!x);
836+
}
837+
838+
const args = type.aliasSymbol
839+
? type.aliasTypeArguments
840+
: (type as ts.TypeReference).typeArguments;
841+
842+
ref.typeArguments = args
843+
?.filter((ref) => !ignoredArgs?.includes(ref))
844+
.map((ref) => convertType(context, ref));
831845
}
832846
return ref;
833847
},

src/lib/converter/utils/nodes.ts

+7
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,10 @@ export function getHeritageTypes(
3737
export function isObjectType(type: ts.Type): type is ts.ObjectType {
3838
return typeof (type as any).objectFlags === "number";
3939
}
40+
41+
export function isTypeReference(type: ts.Type): type is ts.TypeReference {
42+
return (
43+
isObjectType(type) &&
44+
(type.objectFlags & ts.ObjectFlags.Reference) !== 0
45+
);
46+
}

src/test/converter/function/specs.json

-16
Original file line numberDiff line numberDiff line change
@@ -547,14 +547,6 @@
547547
"name": "T",
548548
"package": "typedoc",
549549
"refersToTypeParameter": true
550-
},
551-
{
552-
"type": "intrinsic",
553-
"name": "any"
554-
},
555-
{
556-
"type": "intrinsic",
557-
"name": "any"
558550
}
559551
],
560552
"name": "Iterable",
@@ -705,14 +697,6 @@
705697
"name": "T",
706698
"package": "typedoc",
707699
"refersToTypeParameter": true
708-
},
709-
{
710-
"type": "intrinsic",
711-
"name": "any"
712-
},
713-
{
714-
"type": "intrinsic",
715-
"name": "any"
716700
}
717701
],
718702
"name": "Iterable",

src/test/converter2/issues/gh2820.ts

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function f(a: Uint8Array): Uint8Array {
2+
return a;
3+
}

src/test/issues.c2.test.ts

+8
Original file line numberDiff line numberDiff line change
@@ -1983,4 +1983,12 @@ describe("Issue Tests", () => {
19831983
ok(rename2.isReference());
19841984
ok(rename2.getTargetReflection() === abc);
19851985
});
1986+
1987+
it("#2820 does not include defaulted type arguments", () => {
1988+
const project = convert();
1989+
const f = querySig(project, "f");
1990+
1991+
equal(f.type?.toString(), "Uint8Array");
1992+
equal(f.parameters?.[0].type?.toString(), "Uint8Array");
1993+
});
19861994
});

0 commit comments

Comments
 (0)