use default type parameter rather than unknown when show quick help (#46792)

* use default type parameter rather than `unknown` when show quick help

* prefer default type parameter than constraint for quick info
This commit is contained in:
Song Gao 2021-12-09 09:02:22 +08:00 committed by GitHub
parent 921825585d
commit e2c89af335
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 8 deletions

View File

@ -30263,7 +30263,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;
}

View File

@ -1,16 +1,37 @@
/// <reference path='fourslash.ts'/>
////declare function f<T = boolean, U = string>(x: T, y: U): T;
////f<number, string>(/*1*/);
////f(/*2*/);
////f<number>(/*3*/);
////f<number, string, boolean>(/*4*/);
//// declare function f<T = boolean, U = string>(x: T, y: U): T;
//// f<number, string>(/*1*/);
//// f(/*2*/);
//// f<number>(/*3*/);
//// f<number, string, boolean>(/*4*/);
//// interface A { a: number }
//// interface B extends A { b: string }
//// declare function g<T, U, V extends A = B>(x: T, y: U, z: V): T;
//// declare function h<T, U, V extends A>(x: T, y: U, z: V): T;
//// declare function j<T, U, V = B>(x: T, y: U, z: V): T;
//// g(/*5*/);
//// h(/*6*/);
//// j(/*7*/);
//// g<number>(/*8*/);
//// h<number>(/*9*/);
//// j<number>(/*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" },
);