diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index e753210950a78..f3986c1bc4c7f 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -30248,7 +30248,7 @@ namespace ts {
typeArguments.pop();
}
while (typeArguments.length < typeParameters.length) {
- typeArguments.push(getConstraintOfTypeParameter(typeParameters[typeArguments.length]) || getDefaultTypeArgumentType(isJs));
+ typeArguments.push(getDefaultFromTypeParameter(typeParameters[typeArguments.length]) || getConstraintOfTypeParameter(typeParameters[typeArguments.length]) || getDefaultTypeArgumentType(isJs));
}
return typeArguments;
}
diff --git a/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts b/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts
index b68c7640476bf..68a355d253394 100644
--- a/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts
+++ b/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts
@@ -1,16 +1,37 @@
///
-////declare function f(x: T, y: U): T;
-////f(/*1*/);
-////f(/*2*/);
-////f(/*3*/);
-////f(/*4*/);
+//// declare function f(x: T, y: U): T;
+//// f(/*1*/);
+//// f(/*2*/);
+//// f(/*3*/);
+//// f(/*4*/);
+
+//// interface A { a: number }
+//// interface B extends A { b: string }
+//// declare function g(x: T, y: U, z: V): T;
+//// declare function h(x: T, y: U, z: V): T;
+//// declare function j(x: T, y: U, z: V): T;
+//// g(/*5*/);
+//// h(/*6*/);
+//// j(/*7*/);
+//// g(/*8*/);
+//// h(/*9*/);
+//// j(/*10*/);
verify.signatureHelp(
{ marker: "1", text: "f(x: number, y: string): number" },
{ marker: "2", text: "f(x: boolean, y: string): boolean" },
- // too few -- fill in rest with unknown
- { marker: "3", text: "f(x: number, y: unknown): number" },
+ // too few -- fill in rest with default
+ { marker: "3", text: "f(x: number, y: string): number" },
// too many -- ignore extra type arguments
{ marker: "4", text: "f(x: number, y: string): number" },
+
+ // not matched signature and no type arguments
+ { marker: "5", text: "g(x: unknown, y: unknown, z: B): unknown" },
+ { marker: "6", text: "h(x: unknown, y: unknown, z: A): unknown" },
+ { marker: "7", text: "j(x: unknown, y: unknown, z: B): unknown" },
+ // not matched signature and too few type arguments
+ { marker: "8", text: "g(x: number, y: unknown, z: B): number" },
+ { marker: "9", text: "h(x: number, y: unknown, z: A): number" },
+ { marker: "10", text: "j(x: number, y: unknown, z: B): number" },
);