Skip to content

Commit ebfc911

Browse files
authored
Merge pull request #15362 from Microsoft/contextually-type-spread-assignment
Contextually type object spread expressions
2 parents a0abadb + a94198e commit ebfc911

File tree

6 files changed

+69
-9
lines changed

6 files changed

+69
-9
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12728,6 +12728,8 @@ namespace ts {
1272812728
case SyntaxKind.PropertyAssignment:
1272912729
case SyntaxKind.ShorthandPropertyAssignment:
1273012730
return getContextualTypeForObjectLiteralElement(<ObjectLiteralElementLike>parent);
12731+
case SyntaxKind.SpreadAssignment:
12732+
return getApparentTypeOfContextualType(parent.parent as ObjectLiteralExpression);
1273112733
case SyntaxKind.ArrayLiteralExpression:
1273212734
return getContextualTypeForElementExpression(node);
1273312735
case SyntaxKind.ConditionalExpression:
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//// [contextualTypeObjectSpreadExpression.ts]
2+
interface I {
3+
a: "a";
4+
}
5+
let i: I;
6+
i = { ...{ a: "a" } };
7+
8+
9+
//// [contextualTypeObjectSpreadExpression.js]
10+
var __assign = (this && this.__assign) || Object.assign || function(t) {
11+
for (var s, i = 1, n = arguments.length; i < n; i++) {
12+
s = arguments[i];
13+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
14+
t[p] = s[p];
15+
}
16+
return t;
17+
};
18+
var i;
19+
i = __assign({ a: "a" });
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
=== tests/cases/compiler/contextualTypeObjectSpreadExpression.ts ===
2+
interface I {
3+
>I : Symbol(I, Decl(contextualTypeObjectSpreadExpression.ts, 0, 0))
4+
5+
a: "a";
6+
>a : Symbol(I.a, Decl(contextualTypeObjectSpreadExpression.ts, 0, 13))
7+
}
8+
let i: I;
9+
>i : Symbol(i, Decl(contextualTypeObjectSpreadExpression.ts, 3, 3))
10+
>I : Symbol(I, Decl(contextualTypeObjectSpreadExpression.ts, 0, 0))
11+
12+
i = { ...{ a: "a" } };
13+
>i : Symbol(i, Decl(contextualTypeObjectSpreadExpression.ts, 3, 3))
14+
>a : Symbol(a, Decl(contextualTypeObjectSpreadExpression.ts, 4, 10))
15+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
=== tests/cases/compiler/contextualTypeObjectSpreadExpression.ts ===
2+
interface I {
3+
>I : I
4+
5+
a: "a";
6+
>a : "a"
7+
}
8+
let i: I;
9+
>i : I
10+
>I : I
11+
12+
i = { ...{ a: "a" } };
13+
>i = { ...{ a: "a" } } : { a: "a"; }
14+
>i : I
15+
>{ ...{ a: "a" } } : { a: "a"; }
16+
>{ a: "a" } : { a: "a"; }
17+
>a : string
18+
>"a" : "a"
19+

tests/baselines/reference/objectSpread.types

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ let nested: { a: number, b: boolean, c: string } =
7878
>c : string
7979

8080
{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' }
81-
>{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' } : { c: string; b: boolean; a: number; }
82-
>{ a: 3, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
81+
>{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' } : { c: string; b: false; a: number; }
82+
>{ a: 3, ...{ b: false, c: 'overriden' } } : { b: false; c: string; a: number; }
8383
>a : number
8484
>3 : 3
85-
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
85+
>{ b: false, c: 'overriden' } : { b: false; c: string; }
8686
>b : boolean
8787
>false : false
8888
>c : string
@@ -148,11 +148,11 @@ let combinedNested: { a: number, b: boolean, c: string, d: string } =
148148
>d : string
149149

150150
{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } }
151-
>{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } } : { a: number; d: string; b: boolean; c: string; }
152-
>{ a: 4, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
151+
>{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } } : { a: number; d: string; b: false; c: string; }
152+
>{ a: 4, ...{ b: false, c: 'overriden' } } : { b: false; c: string; a: number; }
153153
>a : number
154154
>4 : 4
155-
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
155+
>{ b: false, c: 'overriden' } : { b: false; c: string; }
156156
>b : boolean
157157
>false : false
158158
>c : string
@@ -172,11 +172,11 @@ let combinedNestedChangeType: { a: number, b: boolean, c: number } =
172172
>c : number
173173

174174
{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 }
175-
>{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 } : { c: number; b: boolean; a: number; }
176-
>{ a: 1, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
175+
>{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 } : { c: number; b: false; a: number; }
176+
>{ a: 1, ...{ b: false, c: 'overriden' } } : { b: false; c: string; a: number; }
177177
>a : number
178178
>1 : 1
179-
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
179+
>{ b: false, c: 'overriden' } : { b: false; c: string; }
180180
>b : boolean
181181
>false : false
182182
>c : string
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
interface I {
2+
a: "a";
3+
}
4+
let i: I;
5+
i = { ...{ a: "a" } };

0 commit comments

Comments
 (0)