Merge pull request #15362 from Microsoft/contextually-type-spread-assignment

Contextually type object spread expressions
This commit is contained in:
Nathan Shively-Sanders
2017-04-24 15:59:44 -07:00
committed by GitHub
6 changed files with 69 additions and 9 deletions

View File

@@ -12728,6 +12728,8 @@ namespace ts {
case SyntaxKind.PropertyAssignment:
case SyntaxKind.ShorthandPropertyAssignment:
return getContextualTypeForObjectLiteralElement(<ObjectLiteralElementLike>parent);
case SyntaxKind.SpreadAssignment:
return getApparentTypeOfContextualType(parent.parent as ObjectLiteralExpression);
case SyntaxKind.ArrayLiteralExpression:
return getContextualTypeForElementExpression(node);
case SyntaxKind.ConditionalExpression:

View File

@@ -0,0 +1,19 @@
//// [contextualTypeObjectSpreadExpression.ts]
interface I {
a: "a";
}
let i: I;
i = { ...{ a: "a" } };
//// [contextualTypeObjectSpreadExpression.js]
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
var i;
i = __assign({ a: "a" });

View File

@@ -0,0 +1,15 @@
=== tests/cases/compiler/contextualTypeObjectSpreadExpression.ts ===
interface I {
>I : Symbol(I, Decl(contextualTypeObjectSpreadExpression.ts, 0, 0))
a: "a";
>a : Symbol(I.a, Decl(contextualTypeObjectSpreadExpression.ts, 0, 13))
}
let i: I;
>i : Symbol(i, Decl(contextualTypeObjectSpreadExpression.ts, 3, 3))
>I : Symbol(I, Decl(contextualTypeObjectSpreadExpression.ts, 0, 0))
i = { ...{ a: "a" } };
>i : Symbol(i, Decl(contextualTypeObjectSpreadExpression.ts, 3, 3))
>a : Symbol(a, Decl(contextualTypeObjectSpreadExpression.ts, 4, 10))

View File

@@ -0,0 +1,19 @@
=== tests/cases/compiler/contextualTypeObjectSpreadExpression.ts ===
interface I {
>I : I
a: "a";
>a : "a"
}
let i: I;
>i : I
>I : I
i = { ...{ a: "a" } };
>i = { ...{ a: "a" } } : { a: "a"; }
>i : I
>{ ...{ a: "a" } } : { a: "a"; }
>{ a: "a" } : { a: "a"; }
>a : string
>"a" : "a"

View File

@@ -78,11 +78,11 @@ let nested: { a: number, b: boolean, c: string } =
>c : string
{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' }
>{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' } : { c: string; b: boolean; a: number; }
>{ a: 3, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
>{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' } : { c: string; b: false; a: number; }
>{ a: 3, ...{ b: false, c: 'overriden' } } : { b: false; c: string; a: number; }
>a : number
>3 : 3
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
>{ b: false, c: 'overriden' } : { b: false; c: string; }
>b : boolean
>false : false
>c : string
@@ -148,11 +148,11 @@ let combinedNested: { a: number, b: boolean, c: string, d: string } =
>d : string
{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } }
>{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } } : { a: number; d: string; b: boolean; c: string; }
>{ a: 4, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
>{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } } : { a: number; d: string; b: false; c: string; }
>{ a: 4, ...{ b: false, c: 'overriden' } } : { b: false; c: string; a: number; }
>a : number
>4 : 4
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
>{ b: false, c: 'overriden' } : { b: false; c: string; }
>b : boolean
>false : false
>c : string
@@ -172,11 +172,11 @@ let combinedNestedChangeType: { a: number, b: boolean, c: number } =
>c : number
{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 }
>{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 } : { c: number; b: boolean; a: number; }
>{ a: 1, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
>{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 } : { c: number; b: false; a: number; }
>{ a: 1, ...{ b: false, c: 'overriden' } } : { b: false; c: string; a: number; }
>a : number
>1 : 1
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
>{ b: false, c: 'overriden' } : { b: false; c: string; }
>b : boolean
>false : false
>c : string

View File

@@ -0,0 +1,5 @@
interface I {
a: "a";
}
let i: I;
i = { ...{ a: "a" } };