mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-03-15 05:55:11 -05:00
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:
@@ -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) {
|
||||
|
||||
@@ -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; });
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user