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" }, );