From 213812ab22ee7773e067db02557d5db6576baf2e Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 24 Apr 2017 15:43:10 -0700 Subject: [PATCH 1/2] Contextually type object spread expressions so `x = { ... { a: "a" } }` will be equivalent to `{ a: "a" }`. --- src/compiler/checker.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 57e9d02ddd8..8471ba7aa1f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -12728,6 +12728,8 @@ namespace ts { case SyntaxKind.PropertyAssignment: case SyntaxKind.ShorthandPropertyAssignment: return getContextualTypeForObjectLiteralElement(parent); + case SyntaxKind.SpreadAssignment: + return getApparentTypeOfContextualType(parent.parent as ObjectLiteralExpression); case SyntaxKind.ArrayLiteralExpression: return getContextualTypeForElementExpression(node); case SyntaxKind.ConditionalExpression: From a94198eb37004afb9955ea0e1c5b83980146a311 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 24 Apr 2017 15:44:07 -0700 Subject: [PATCH 2/2] Test contextual type of object spread expressions And update baselines. --- .../contextualTypeObjectSpreadExpression.js | 19 +++++++++++++++++++ ...ntextualTypeObjectSpreadExpression.symbols | 15 +++++++++++++++ ...contextualTypeObjectSpreadExpression.types | 19 +++++++++++++++++++ tests/baselines/reference/objectSpread.types | 18 +++++++++--------- .../contextualTypeObjectSpreadExpression.ts | 5 +++++ 5 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 tests/baselines/reference/contextualTypeObjectSpreadExpression.js create mode 100644 tests/baselines/reference/contextualTypeObjectSpreadExpression.symbols create mode 100644 tests/baselines/reference/contextualTypeObjectSpreadExpression.types create mode 100644 tests/cases/compiler/contextualTypeObjectSpreadExpression.ts diff --git a/tests/baselines/reference/contextualTypeObjectSpreadExpression.js b/tests/baselines/reference/contextualTypeObjectSpreadExpression.js new file mode 100644 index 00000000000..5836c18b23a --- /dev/null +++ b/tests/baselines/reference/contextualTypeObjectSpreadExpression.js @@ -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" }); diff --git a/tests/baselines/reference/contextualTypeObjectSpreadExpression.symbols b/tests/baselines/reference/contextualTypeObjectSpreadExpression.symbols new file mode 100644 index 00000000000..12cb162de99 --- /dev/null +++ b/tests/baselines/reference/contextualTypeObjectSpreadExpression.symbols @@ -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)) + diff --git a/tests/baselines/reference/contextualTypeObjectSpreadExpression.types b/tests/baselines/reference/contextualTypeObjectSpreadExpression.types new file mode 100644 index 00000000000..98b700b019a --- /dev/null +++ b/tests/baselines/reference/contextualTypeObjectSpreadExpression.types @@ -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" + diff --git a/tests/baselines/reference/objectSpread.types b/tests/baselines/reference/objectSpread.types index e388b3aef14..7bac35119ed 100644 --- a/tests/baselines/reference/objectSpread.types +++ b/tests/baselines/reference/objectSpread.types @@ -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 diff --git a/tests/cases/compiler/contextualTypeObjectSpreadExpression.ts b/tests/cases/compiler/contextualTypeObjectSpreadExpression.ts new file mode 100644 index 00000000000..6277b18a3df --- /dev/null +++ b/tests/cases/compiler/contextualTypeObjectSpreadExpression.ts @@ -0,0 +1,5 @@ +interface I { + a: "a"; +} +let i: I; +i = { ...{ a: "a" } };