From 6b0de7b5ae3a9c8f895cea5e7d243160f2bdea20 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 16 Nov 2016 13:38:25 -0800 Subject: [PATCH] Test assignability checking of object rests --- .../reference/objectRestNegative.errors.txt | 21 +++++++++++++++---- .../baselines/reference/objectRestNegative.js | 9 ++++++++ .../reference/objectSpreadNoTransform.js | 2 +- .../reference/objectSpreadNoTransform.symbols | 2 +- .../reference/objectSpreadNoTransform.types | 2 +- .../types/rest/objectRestNegative.ts | 6 ++++++ .../types/spread/objectSpreadNoTransform.ts | 2 +- 7 files changed, 36 insertions(+), 8 deletions(-) diff --git a/tests/baselines/reference/objectRestNegative.errors.txt b/tests/baselines/reference/objectRestNegative.errors.txt index 793a7d31fc8..345e99723bd 100644 --- a/tests/baselines/reference/objectRestNegative.errors.txt +++ b/tests/baselines/reference/objectRestNegative.errors.txt @@ -1,14 +1,27 @@ tests/cases/conformance/types/rest/objectRestNegative.ts(2,10): error TS2462: A rest element must be last in a destructuring pattern -tests/cases/conformance/types/rest/objectRestNegative.ts(3,31): error TS2462: A rest element must be last in a destructuring pattern -tests/cases/conformance/types/rest/objectRestNegative.ts(6,17): error TS2700: Rest types may only be created from object types. -tests/cases/conformance/types/rest/objectRestNegative.ts(11,9): error TS2701: The target of an object rest assignment must be a variable or a property access. +tests/cases/conformance/types/rest/objectRestNegative.ts(6,10): error TS2322: Type '{ a: number; }' is not assignable to type '{ a: string; }'. + Types of property 'a' are incompatible. + Type 'number' is not assignable to type 'string'. +tests/cases/conformance/types/rest/objectRestNegative.ts(9,31): error TS2462: A rest element must be last in a destructuring pattern +tests/cases/conformance/types/rest/objectRestNegative.ts(12,17): error TS2700: Rest types may only be created from object types. +tests/cases/conformance/types/rest/objectRestNegative.ts(17,9): error TS2701: The target of an object rest assignment must be a variable or a property access. -==== tests/cases/conformance/types/rest/objectRestNegative.ts (4 errors) ==== +==== tests/cases/conformance/types/rest/objectRestNegative.ts (5 errors) ==== let o = { a: 1, b: 'no' }; var { ...mustBeLast, a } = o; ~~~~~~~~~~ !!! error TS2462: A rest element must be last in a destructuring pattern + + var b: string; + let notAssignable: { a: string }; + ({ b, ...notAssignable } = o); + ~~~~~~~~~~~~~ +!!! error TS2322: Type '{ a: number; }' is not assignable to type '{ a: string; }'. +!!! error TS2322: Types of property 'a' are incompatible. +!!! error TS2322: Type 'number' is not assignable to type 'string'. + + function stillMustBeLast({ ...mustBeLast, a }: { a: number, b: string }): void { ~~~~~~~~~~ !!! error TS2462: A rest element must be last in a destructuring pattern diff --git a/tests/baselines/reference/objectRestNegative.js b/tests/baselines/reference/objectRestNegative.js index a2da998cf8a..f8c5b72ada5 100644 --- a/tests/baselines/reference/objectRestNegative.js +++ b/tests/baselines/reference/objectRestNegative.js @@ -1,6 +1,12 @@ //// [objectRestNegative.ts] let o = { a: 1, b: 'no' }; var { ...mustBeLast, a } = o; + +var b: string; +let notAssignable: { a: string }; +({ b, ...notAssignable } = o); + + function stillMustBeLast({ ...mustBeLast, a }: { a: number, b: string }): void { } function generic(t: T) { @@ -24,6 +30,9 @@ var __rest = (this && this.__rest) || function (s, e) { }; var o = { a: 1, b: 'no' }; var a = o.a; +var b; +var notAssignable; +(b = o.b, o, notAssignable = __rest(o, ["b"])); function stillMustBeLast(_a) { var a = _a.a; } diff --git a/tests/baselines/reference/objectSpreadNoTransform.js b/tests/baselines/reference/objectSpreadNoTransform.js index 3442d086409..5ad9c01e599 100644 --- a/tests/baselines/reference/objectSpreadNoTransform.js +++ b/tests/baselines/reference/objectSpreadNoTransform.js @@ -2,7 +2,7 @@ const y = { a: 'yes', b: 'no' }; const o = { x: 1, ...y }; var b; -var rest; +var rest: any; ({ b, ...rest } = o); diff --git a/tests/baselines/reference/objectSpreadNoTransform.symbols b/tests/baselines/reference/objectSpreadNoTransform.symbols index 78423330dbb..b2062697cdd 100644 --- a/tests/baselines/reference/objectSpreadNoTransform.symbols +++ b/tests/baselines/reference/objectSpreadNoTransform.symbols @@ -12,7 +12,7 @@ const o = { x: 1, ...y }; var b; >b : Symbol(b, Decl(objectSpreadNoTransform.ts, 2, 3)) -var rest; +var rest: any; >rest : Symbol(rest, Decl(objectSpreadNoTransform.ts, 3, 3)) ({ b, ...rest } = o); diff --git a/tests/baselines/reference/objectSpreadNoTransform.types b/tests/baselines/reference/objectSpreadNoTransform.types index c7cfdf8f006..bb09fd418c2 100644 --- a/tests/baselines/reference/objectSpreadNoTransform.types +++ b/tests/baselines/reference/objectSpreadNoTransform.types @@ -17,7 +17,7 @@ const o = { x: 1, ...y }; var b; >b : any -var rest; +var rest: any; >rest : any ({ b, ...rest } = o); diff --git a/tests/cases/conformance/types/rest/objectRestNegative.ts b/tests/cases/conformance/types/rest/objectRestNegative.ts index 75cbe9a55e4..c224c8cd30e 100644 --- a/tests/cases/conformance/types/rest/objectRestNegative.ts +++ b/tests/cases/conformance/types/rest/objectRestNegative.ts @@ -1,5 +1,11 @@ let o = { a: 1, b: 'no' }; var { ...mustBeLast, a } = o; + +var b: string; +let notAssignable: { a: string }; +({ b, ...notAssignable } = o); + + function stillMustBeLast({ ...mustBeLast, a }: { a: number, b: string }): void { } function generic(t: T) { diff --git a/tests/cases/conformance/types/spread/objectSpreadNoTransform.ts b/tests/cases/conformance/types/spread/objectSpreadNoTransform.ts index 36c75e70887..86bcb7eeee5 100644 --- a/tests/cases/conformance/types/spread/objectSpreadNoTransform.ts +++ b/tests/cases/conformance/types/spread/objectSpreadNoTransform.ts @@ -2,5 +2,5 @@ const y = { a: 'yes', b: 'no' }; const o = { x: 1, ...y }; var b; -var rest; +var rest: any; ({ b, ...rest } = o);