Skip to content

Commit 9a63b1f

Browse files
committed
Collect contravariant-only inference candidates from shorter annotated functions
1 parent bbfb9ac commit 9a63b1f

File tree

4 files changed

+127
-0
lines changed

4 files changed

+127
-0
lines changed

src/compiler/checker.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35379,6 +35379,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3537935379
assignNonContextualParameterTypes(signature);
3538035380
}
3538135381
}
35382+
else if (contextualSignature && !node.typeParameters && contextualSignature.parameters.length > node.parameters.length) {
35383+
const inferenceContext = getInferenceContext(node);
35384+
if (checkMode && checkMode & CheckMode.Inferential) {
35385+
inferFromAnnotatedParameters(signature, contextualSignature, inferenceContext!);
35386+
}
35387+
}
3538235388
if (contextualSignature && !getReturnTypeFromAnnotation(node) && !signature.resolvedReturnType) {
3538335389
const returnType = getReturnTypeFromBody(node, checkMode);
3538435390
if (!signature.resolvedReturnType) {
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
=== tests/cases/compiler/contravariantOnlyInferenceFromAnnotatedFunction.ts ===
2+
// repro from #52580
3+
4+
type Funcs<A, B extends Record<string, unknown>> = {
5+
>Funcs : Symbol(Funcs, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 0, 0))
6+
>A : Symbol(A, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 2, 11))
7+
>B : Symbol(B, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 2, 13))
8+
>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --))
9+
10+
[K in keyof B]: {
11+
>K : Symbol(K, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 3, 3))
12+
>B : Symbol(B, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 2, 13))
13+
14+
fn: (a: A, b: B) => void;
15+
>fn : Symbol(fn, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 3, 19))
16+
>a : Symbol(a, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 4, 9))
17+
>A : Symbol(A, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 2, 11))
18+
>b : Symbol(b, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 4, 14))
19+
>B : Symbol(B, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 2, 13))
20+
21+
thing: B[K];
22+
>thing : Symbol(thing, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 4, 29))
23+
>B : Symbol(B, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 2, 13))
24+
>K : Symbol(K, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 3, 3))
25+
26+
};
27+
}
28+
29+
declare function foo<A, B extends Record<string, unknown>>(fns: Funcs<A, B>): [A, B]
30+
>foo : Symbol(foo, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 7, 1))
31+
>A : Symbol(A, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 9, 21))
32+
>B : Symbol(B, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 9, 23))
33+
>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --))
34+
>fns : Symbol(fns, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 9, 59))
35+
>Funcs : Symbol(Funcs, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 0, 0))
36+
>A : Symbol(A, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 9, 21))
37+
>B : Symbol(B, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 9, 23))
38+
>A : Symbol(A, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 9, 21))
39+
>B : Symbol(B, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 9, 23))
40+
41+
const result = foo({
42+
>result : Symbol(result, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 11, 5))
43+
>foo : Symbol(foo, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 7, 1))
44+
45+
bar: {
46+
>bar : Symbol(bar, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 11, 20))
47+
48+
fn: (a: string) => {},
49+
>fn : Symbol(fn, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 12, 8))
50+
>a : Symbol(a, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 13, 9))
51+
52+
thing: 'asd',
53+
>thing : Symbol(thing, Decl(contravariantOnlyInferenceFromAnnotatedFunction.ts, 13, 26))
54+
55+
},
56+
});
57+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
=== tests/cases/compiler/contravariantOnlyInferenceFromAnnotatedFunction.ts ===
2+
// repro from #52580
3+
4+
type Funcs<A, B extends Record<string, unknown>> = {
5+
>Funcs : Funcs<A, B>
6+
7+
[K in keyof B]: {
8+
fn: (a: A, b: B) => void;
9+
>fn : (a: A, b: B) => void
10+
>a : A
11+
>b : B
12+
13+
thing: B[K];
14+
>thing : B[K]
15+
16+
};
17+
}
18+
19+
declare function foo<A, B extends Record<string, unknown>>(fns: Funcs<A, B>): [A, B]
20+
>foo : <A, B extends Record<string, unknown>>(fns: Funcs<A, B>) => [A, B]
21+
>fns : Funcs<A, B>
22+
23+
const result = foo({
24+
>result : [string, { bar: string; }]
25+
>foo({ bar: { fn: (a: string) => {}, thing: 'asd', },}) : [string, { bar: string; }]
26+
>foo : <A, B extends Record<string, unknown>>(fns: Funcs<A, B>) => [A, B]
27+
>{ bar: { fn: (a: string) => {}, thing: 'asd', },} : { bar: { fn: (a: string) => void; thing: string; }; }
28+
29+
bar: {
30+
>bar : { fn: (a: string) => void; thing: string; }
31+
>{ fn: (a: string) => {}, thing: 'asd', } : { fn: (a: string) => void; thing: string; }
32+
33+
fn: (a: string) => {},
34+
>fn : (a: string) => void
35+
>(a: string) => {} : (a: string) => void
36+
>a : string
37+
38+
thing: 'asd',
39+
>thing : string
40+
>'asd' : "asd"
41+
42+
},
43+
});
44+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// repro from #52580
5+
6+
type Funcs<A, B extends Record<string, unknown>> = {
7+
[K in keyof B]: {
8+
fn: (a: A, b: B) => void;
9+
thing: B[K];
10+
};
11+
}
12+
13+
declare function foo<A, B extends Record<string, unknown>>(fns: Funcs<A, B>): [A, B]
14+
15+
const result = foo({
16+
bar: {
17+
fn: (a: string) => {},
18+
thing: 'asd',
19+
},
20+
});

0 commit comments

Comments
 (0)