Skip to content

Commit 2beeca3

Browse files
committed
Merge branch 'main' of https://github.com/microsoft/TypeScript into feat/61216
2 parents 03f7c4b + c4d731a commit 2beeca3

5 files changed

Lines changed: 344 additions & 1 deletion

File tree

‎tsc/internal/checker/inference.go‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1378,7 +1378,8 @@ func (c *Checker) getInferredType(n *InferenceContext, index int) *Type {
13781378
constraint := c.getConstraintOfTypeParameter(inference.typeParameter)
13791379
if constraint != nil {
13801380
instantiatedConstraint := c.instantiateType(constraint, n.nonFixingMapper)
1381-
if inferredType != nil && n.flags&InferenceFlagsNoConstraintChecks == 0 {
1381+
// A pure return type inference is still filtered in a recursive call resolution, whose result can become the type of the enclosing declaration.
1382+
if inferredType != nil && (n.flags&InferenceFlagsNoConstraintChecks == 0 || inference.priority == InferencePriorityReturnType) {
13821383
constraintWithThis := c.getTypeWithThisArgument(instantiatedConstraint, inferredType, false)
13831384
if n.compareTypes(inferredType, constraintWithThis, false) == TernaryFalse {
13841385
var filteredByConstraint *Type
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
recursiveTypeInferenceReturnTypeConstraint.ts(10,5): error TS2345: Argument of type '42' is not assignable to parameter of type '"x"'.
2+
recursiveTypeInferenceReturnTypeConstraint.ts(13,5): error TS2345: Argument of type '42' is not assignable to parameter of type '"x"'.
3+
4+
5+
==== recursiveTypeInferenceReturnTypeConstraint.ts (2 errors) ====
6+
// A pure return type inference stays filtered by its constraint in a recursive call resolution.
7+
8+
interface Schema<O> { readonly out: O }
9+
type Shape = Record<string, Schema<any>>;
10+
type Lookup = { x: 1; dflt: 2 };
11+
declare function object<S extends Shape, P extends keyof Lookup>(shape: S): Schema<{ [K in keyof S]: S[K]["out"] }> & { p: P; q: Lookup[P]; f: (x: P) => void };
12+
declare const str: Schema<string>;
13+
14+
const u = object({ name: str }) satisfies { p: number | "x" };
15+
u.f(42); // error
16+
~~
17+
!!! error TS2345: Argument of type '42' is not assignable to parameter of type '"x"'.
18+
19+
const t = object({ name: str, get rec() { return object({ inner: t }); } }) satisfies { p: number | "x" };
20+
t.f(42); // error
21+
~~
22+
!!! error TS2345: Argument of type '42' is not assignable to parameter of type '"x"'.
23+
const tq: 1 = t.q;
24+
25+
const a = object({ name: str, get r() { return b; } }) satisfies { p: number | "x" };
26+
const b = object({ name: str, get r() { return a; } }) satisfies { p: number | "x" };
27+
const aq: 1 = a.q;
28+
const bq: 1 = b.q;
29+
30+
declare function pick(x: { p: "x" }): Schema<"picked-x">;
31+
declare function pick(x: { p: number | "x" }): Schema<"picked-wide">;
32+
const s = object({ name: str, get rec() { return pick(s); } }) satisfies { p: number | "x" };
33+
const sk: "picked-x" = pick(s).out;
34+
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
//// [tests/cases/compiler/recursiveTypeInferenceReturnTypeConstraint.ts] ////
2+
3+
=== recursiveTypeInferenceReturnTypeConstraint.ts ===
4+
// A pure return type inference stays filtered by its constraint in a recursive call resolution.
5+
6+
interface Schema<O> { readonly out: O }
7+
>Schema : Symbol(Schema, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 0, 0))
8+
>O : Symbol(O, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 2, 17))
9+
>out : Symbol(Schema.out, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 2, 21))
10+
>O : Symbol(O, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 2, 17))
11+
12+
type Shape = Record<string, Schema<any>>;
13+
>Shape : Symbol(Shape, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 2, 39))
14+
>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --))
15+
>Schema : Symbol(Schema, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 0, 0))
16+
17+
type Lookup = { x: 1; dflt: 2 };
18+
>Lookup : Symbol(Lookup, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 3, 41))
19+
>x : Symbol(x, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 15))
20+
>dflt : Symbol(dflt, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 21))
21+
22+
declare function object<S extends Shape, P extends keyof Lookup>(shape: S): Schema<{ [K in keyof S]: S[K]["out"] }> & { p: P; q: Lookup[P]; f: (x: P) => void };
23+
>object : Symbol(object, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 32))
24+
>S : Symbol(S, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 24))
25+
>Shape : Symbol(Shape, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 2, 39))
26+
>P : Symbol(P, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 40))
27+
>Lookup : Symbol(Lookup, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 3, 41))
28+
>shape : Symbol(shape, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 65))
29+
>S : Symbol(S, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 24))
30+
>Schema : Symbol(Schema, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 0, 0))
31+
>K : Symbol(K, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 86))
32+
>S : Symbol(S, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 24))
33+
>S : Symbol(S, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 24))
34+
>K : Symbol(K, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 86))
35+
>p : Symbol(p, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 119))
36+
>P : Symbol(P, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 40))
37+
>q : Symbol(q, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 125))
38+
>Lookup : Symbol(Lookup, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 3, 41))
39+
>P : Symbol(P, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 40))
40+
>f : Symbol(f, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 139))
41+
>x : Symbol(x, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 144))
42+
>P : Symbol(P, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 40))
43+
44+
declare const str: Schema<string>;
45+
>str : Symbol(str, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 6, 13))
46+
>Schema : Symbol(Schema, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 0, 0))
47+
48+
const u = object({ name: str }) satisfies { p: number | "x" };
49+
>u : Symbol(u, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 8, 5))
50+
>object : Symbol(object, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 32))
51+
>name : Symbol(name, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 8, 18))
52+
>str : Symbol(str, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 6, 13))
53+
>p : Symbol(p, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 8, 43))
54+
55+
u.f(42); // error
56+
>u.f : Symbol(f, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 139))
57+
>u : Symbol(u, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 8, 5))
58+
>f : Symbol(f, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 139))
59+
60+
const t = object({ name: str, get rec() { return object({ inner: t }); } }) satisfies { p: number | "x" };
61+
>t : Symbol(t, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 11, 5))
62+
>object : Symbol(object, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 32))
63+
>name : Symbol(name, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 11, 18))
64+
>str : Symbol(str, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 6, 13))
65+
>rec : Symbol(rec, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 11, 29))
66+
>object : Symbol(object, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 32))
67+
>inner : Symbol(inner, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 11, 57))
68+
>t : Symbol(t, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 11, 5))
69+
>p : Symbol(p, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 11, 87))
70+
71+
t.f(42); // error
72+
>t.f : Symbol(f, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 139))
73+
>t : Symbol(t, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 11, 5))
74+
>f : Symbol(f, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 139))
75+
76+
const tq: 1 = t.q;
77+
>tq : Symbol(tq, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 13, 5))
78+
>t.q : Symbol(q, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 125))
79+
>t : Symbol(t, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 11, 5))
80+
>q : Symbol(q, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 125))
81+
82+
const a = object({ name: str, get r() { return b; } }) satisfies { p: number | "x" };
83+
>a : Symbol(a, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 15, 5))
84+
>object : Symbol(object, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 32))
85+
>name : Symbol(name, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 15, 18))
86+
>str : Symbol(str, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 6, 13))
87+
>r : Symbol(r, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 15, 29))
88+
>b : Symbol(b, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 16, 5))
89+
>p : Symbol(p, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 15, 66))
90+
91+
const b = object({ name: str, get r() { return a; } }) satisfies { p: number | "x" };
92+
>b : Symbol(b, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 16, 5))
93+
>object : Symbol(object, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 32))
94+
>name : Symbol(name, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 16, 18))
95+
>str : Symbol(str, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 6, 13))
96+
>r : Symbol(r, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 16, 29))
97+
>a : Symbol(a, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 15, 5))
98+
>p : Symbol(p, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 16, 66))
99+
100+
const aq: 1 = a.q;
101+
>aq : Symbol(aq, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 17, 5))
102+
>a.q : Symbol(q, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 125))
103+
>a : Symbol(a, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 15, 5))
104+
>q : Symbol(q, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 125))
105+
106+
const bq: 1 = b.q;
107+
>bq : Symbol(bq, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 18, 5))
108+
>b.q : Symbol(q, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 125))
109+
>b : Symbol(b, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 16, 5))
110+
>q : Symbol(q, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 5, 125))
111+
112+
declare function pick(x: { p: "x" }): Schema<"picked-x">;
113+
>pick : Symbol(pick, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 18, 18), Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 20, 57))
114+
>x : Symbol(x, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 20, 22))
115+
>p : Symbol(p, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 20, 26))
116+
>Schema : Symbol(Schema, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 0, 0))
117+
118+
declare function pick(x: { p: number | "x" }): Schema<"picked-wide">;
119+
>pick : Symbol(pick, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 18, 18), Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 20, 57))
120+
>x : Symbol(x, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 21, 22))
121+
>p : Symbol(p, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 21, 26))
122+
>Schema : Symbol(Schema, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 0, 0))
123+
124+
const s = object({ name: str, get rec() { return pick(s); } }) satisfies { p: number | "x" };
125+
>s : Symbol(s, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 22, 5))
126+
>object : Symbol(object, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 4, 32))
127+
>name : Symbol(name, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 22, 18))
128+
>str : Symbol(str, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 6, 13))
129+
>rec : Symbol(rec, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 22, 29))
130+
>pick : Symbol(pick, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 18, 18), Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 20, 57))
131+
>s : Symbol(s, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 22, 5))
132+
>p : Symbol(p, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 22, 74))
133+
134+
const sk: "picked-x" = pick(s).out;
135+
>sk : Symbol(sk, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 23, 5))
136+
>pick(s).out : Symbol(Schema.out, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 2, 21))
137+
>pick : Symbol(pick, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 18, 18), Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 20, 57))
138+
>s : Symbol(s, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 22, 5))
139+
>out : Symbol(Schema.out, Decl(recursiveTypeInferenceReturnTypeConstraint.ts, 2, 21))
140+

0 commit comments

Comments
 (0)