Skip to content

Commit 42f0cf6

Browse files
authored
Don't eagerly get apparent type of spread expression contextual type (#44002)
* Don't get apparent type of contextual type for spread expressions * Add regression test
1 parent cb9cd89 commit 42f0cf6

File tree

5 files changed

+157
-1
lines changed

5 files changed

+157
-1
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25536,7 +25536,7 @@ namespace ts {
2553625536
case SyntaxKind.ShorthandPropertyAssignment:
2553725537
return getContextualTypeForObjectLiteralElement(<PropertyAssignment | ShorthandPropertyAssignment>parent, contextFlags);
2553825538
case SyntaxKind.SpreadAssignment:
25539-
return getApparentTypeOfContextualType(parent.parent as ObjectLiteralExpression, contextFlags);
25539+
return getContextualType(parent.parent as ObjectLiteralExpression, contextFlags);
2554025540
case SyntaxKind.ArrayLiteralExpression: {
2554125541
const arrayLiteral = <ArrayLiteralExpression>parent;
2554225542
const type = getApparentTypeOfContextualType(arrayLiteral, contextFlags);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//// [spreadExpressionContextualType.ts]
2+
// Repro from #43966
3+
4+
interface Orange {
5+
name: string;
6+
}
7+
8+
interface Apple {
9+
name: string;
10+
}
11+
12+
function test<T extends Apple | Orange>(item: T): T {
13+
return { ...item };
14+
}
15+
16+
function test2<T extends Apple | Orange>(item: T): T {
17+
const x = { ...item };
18+
return x;
19+
}
20+
21+
22+
//// [spreadExpressionContextualType.js]
23+
"use strict";
24+
// Repro from #43966
25+
var __assign = (this && this.__assign) || function () {
26+
__assign = Object.assign || function(t) {
27+
for (var s, i = 1, n = arguments.length; i < n; i++) {
28+
s = arguments[i];
29+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
30+
t[p] = s[p];
31+
}
32+
return t;
33+
};
34+
return __assign.apply(this, arguments);
35+
};
36+
function test(item) {
37+
return __assign({}, item);
38+
}
39+
function test2(item) {
40+
var x = __assign({}, item);
41+
return x;
42+
}
43+
44+
45+
//// [spreadExpressionContextualType.d.ts]
46+
interface Orange {
47+
name: string;
48+
}
49+
interface Apple {
50+
name: string;
51+
}
52+
declare function test<T extends Apple | Orange>(item: T): T;
53+
declare function test2<T extends Apple | Orange>(item: T): T;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
=== tests/cases/compiler/spreadExpressionContextualType.ts ===
2+
// Repro from #43966
3+
4+
interface Orange {
5+
>Orange : Symbol(Orange, Decl(spreadExpressionContextualType.ts, 0, 0))
6+
7+
name: string;
8+
>name : Symbol(Orange.name, Decl(spreadExpressionContextualType.ts, 2, 18))
9+
}
10+
11+
interface Apple {
12+
>Apple : Symbol(Apple, Decl(spreadExpressionContextualType.ts, 4, 1))
13+
14+
name: string;
15+
>name : Symbol(Apple.name, Decl(spreadExpressionContextualType.ts, 6, 17))
16+
}
17+
18+
function test<T extends Apple | Orange>(item: T): T {
19+
>test : Symbol(test, Decl(spreadExpressionContextualType.ts, 8, 1))
20+
>T : Symbol(T, Decl(spreadExpressionContextualType.ts, 10, 14))
21+
>Apple : Symbol(Apple, Decl(spreadExpressionContextualType.ts, 4, 1))
22+
>Orange : Symbol(Orange, Decl(spreadExpressionContextualType.ts, 0, 0))
23+
>item : Symbol(item, Decl(spreadExpressionContextualType.ts, 10, 40))
24+
>T : Symbol(T, Decl(spreadExpressionContextualType.ts, 10, 14))
25+
>T : Symbol(T, Decl(spreadExpressionContextualType.ts, 10, 14))
26+
27+
return { ...item };
28+
>item : Symbol(item, Decl(spreadExpressionContextualType.ts, 10, 40))
29+
}
30+
31+
function test2<T extends Apple | Orange>(item: T): T {
32+
>test2 : Symbol(test2, Decl(spreadExpressionContextualType.ts, 12, 1))
33+
>T : Symbol(T, Decl(spreadExpressionContextualType.ts, 14, 15))
34+
>Apple : Symbol(Apple, Decl(spreadExpressionContextualType.ts, 4, 1))
35+
>Orange : Symbol(Orange, Decl(spreadExpressionContextualType.ts, 0, 0))
36+
>item : Symbol(item, Decl(spreadExpressionContextualType.ts, 14, 41))
37+
>T : Symbol(T, Decl(spreadExpressionContextualType.ts, 14, 15))
38+
>T : Symbol(T, Decl(spreadExpressionContextualType.ts, 14, 15))
39+
40+
const x = { ...item };
41+
>x : Symbol(x, Decl(spreadExpressionContextualType.ts, 15, 9))
42+
>item : Symbol(item, Decl(spreadExpressionContextualType.ts, 14, 41))
43+
44+
return x;
45+
>x : Symbol(x, Decl(spreadExpressionContextualType.ts, 15, 9))
46+
}
47+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
=== tests/cases/compiler/spreadExpressionContextualType.ts ===
2+
// Repro from #43966
3+
4+
interface Orange {
5+
name: string;
6+
>name : string
7+
}
8+
9+
interface Apple {
10+
name: string;
11+
>name : string
12+
}
13+
14+
function test<T extends Apple | Orange>(item: T): T {
15+
>test : <T extends Orange | Apple>(item: T) => T
16+
>item : T
17+
18+
return { ...item };
19+
>{ ...item } : T
20+
>item : T
21+
}
22+
23+
function test2<T extends Apple | Orange>(item: T): T {
24+
>test2 : <T extends Orange | Apple>(item: T) => T
25+
>item : T
26+
27+
const x = { ...item };
28+
>x : T
29+
>{ ...item } : T
30+
>item : T
31+
32+
return x;
33+
>x : T
34+
}
35+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// @strict: true
2+
// @declaration: true
3+
4+
// Repro from #43966
5+
6+
interface Orange {
7+
name: string;
8+
}
9+
10+
interface Apple {
11+
name: string;
12+
}
13+
14+
function test<T extends Apple | Orange>(item: T): T {
15+
return { ...item };
16+
}
17+
18+
function test2<T extends Apple | Orange>(item: T): T {
19+
const x = { ...item };
20+
return x;
21+
}

0 commit comments

Comments
 (0)