Refrain from attempting to perform parameter fixing on a generic signature multiple times (#43835)

* Refrain from attempting to perform parameter fixing on a generic signature multiple times

* Remove assertion
This commit is contained in:
Wesley Wigham
2021-04-27 10:49:27 -07:00
committed by GitHub
parent 353dc1814f
commit bbad560912
5 changed files with 69 additions and 1 deletions

View File

@@ -30345,7 +30345,14 @@ namespace ts {
}
function assignContextualParameterTypes(signature: Signature, context: Signature) {
signature.typeParameters = context.typeParameters;
if (context.typeParameters) {
if (!signature.typeParameters) {
signature.typeParameters = context.typeParameters;
}
else {
return; // This signature has already has a contextual inference performed and cached on it!
}
}
if (context.thisParameter) {
const parameter = signature.thisParameter;
if (!parameter || parameter.valueDeclaration && !(<ParameterDeclaration>parameter.valueDeclaration).type) {

View File

@@ -0,0 +1,10 @@
//// [contextuallyTypedGenericAssignment.ts]
function foo<A extends any[]>(
arg: <T extends { a: number }>(t: T, ...rest: A) => number
) { }
foo((t, u: number) => t.a)
//// [contextuallyTypedGenericAssignment.js]
function foo(arg) { }
foo(function (t, u) { return t.a; });

View File

@@ -0,0 +1,24 @@
=== tests/cases/compiler/contextuallyTypedGenericAssignment.ts ===
function foo<A extends any[]>(
>foo : Symbol(foo, Decl(contextuallyTypedGenericAssignment.ts, 0, 0))
>A : Symbol(A, Decl(contextuallyTypedGenericAssignment.ts, 0, 13))
arg: <T extends { a: number }>(t: T, ...rest: A) => number
>arg : Symbol(arg, Decl(contextuallyTypedGenericAssignment.ts, 0, 30))
>T : Symbol(T, Decl(contextuallyTypedGenericAssignment.ts, 1, 10))
>a : Symbol(a, Decl(contextuallyTypedGenericAssignment.ts, 1, 21))
>t : Symbol(t, Decl(contextuallyTypedGenericAssignment.ts, 1, 35))
>T : Symbol(T, Decl(contextuallyTypedGenericAssignment.ts, 1, 10))
>rest : Symbol(rest, Decl(contextuallyTypedGenericAssignment.ts, 1, 40))
>A : Symbol(A, Decl(contextuallyTypedGenericAssignment.ts, 0, 13))
) { }
foo((t, u: number) => t.a)
>foo : Symbol(foo, Decl(contextuallyTypedGenericAssignment.ts, 0, 0))
>t : Symbol(t, Decl(contextuallyTypedGenericAssignment.ts, 4, 5))
>u : Symbol(u, Decl(contextuallyTypedGenericAssignment.ts, 4, 7))
>t.a : Symbol(a, Decl(contextuallyTypedGenericAssignment.ts, 1, 21))
>t : Symbol(t, Decl(contextuallyTypedGenericAssignment.ts, 4, 5))
>a : Symbol(a, Decl(contextuallyTypedGenericAssignment.ts, 1, 21))

View File

@@ -0,0 +1,22 @@
=== tests/cases/compiler/contextuallyTypedGenericAssignment.ts ===
function foo<A extends any[]>(
>foo : <A extends any[]>(arg: <T extends { a: number; }>(t: T, ...rest: A) => number) => void
arg: <T extends { a: number }>(t: T, ...rest: A) => number
>arg : <T extends { a: number; }>(t: T, ...rest: A) => number
>a : number
>t : T
>rest : A
) { }
foo((t, u: number) => t.a)
>foo((t, u: number) => t.a) : void
>foo : <A extends any[]>(arg: <T extends { a: number; }>(t: T, ...rest: A) => number) => void
>(t, u: number) => t.a : <T extends { a: number; }>(t: T, u: number) => number
>t : T
>u : number
>t.a : number
>t : T
>a : number

View File

@@ -0,0 +1,5 @@
function foo<A extends any[]>(
arg: <T extends { a: number }>(t: T, ...rest: A) => number
) { }
foo((t, u: number) => t.a)