From ad67cd31991853aa26068427d6c2c42f033e81e3 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 16 Jul 2015 19:02:32 -0700 Subject: [PATCH 1/3] Don't fall back to any when typing tuples --- src/compiler/checker.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7d022825ea7..2a5a3578221 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2274,10 +2274,6 @@ namespace ts { // fact an iterable or array (depending on target language). let elementType = checkIteratedTypeOrElementType(parentType, pattern, /*allowStringInput*/ false); if (!declaration.dotDotDotToken) { - if (isTypeAny(elementType)) { - return elementType; - } - // Use specific property type when parent is a tuple or numeric index type when parent is an array let propName = "" + indexOf(pattern.elements, declaration); type = isTupleLikeType(parentType) From 4ab9c0213626498ad62338476c94ec2f55491152 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 16 Jul 2015 19:03:06 -0700 Subject: [PATCH 2/3] Accept baselines --- .../reference/arityAndOrderCompatibility01.errors.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/baselines/reference/arityAndOrderCompatibility01.errors.txt b/tests/baselines/reference/arityAndOrderCompatibility01.errors.txt index 391fbf42384..d13e0a265f7 100644 --- a/tests/baselines/reference/arityAndOrderCompatibility01.errors.txt +++ b/tests/baselines/reference/arityAndOrderCompatibility01.errors.txt @@ -1,6 +1,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(13,12): error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(14,12): error TS2460: Type 'StrNum' has no property '2'. tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,5): error TS2461: Type '{ 0: string; 1: number; }' is not an array type. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,12): error TS2460: Type '{ 0: string; 1: number; }' has no property '2'. tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(16,5): error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'. Types of property '0' are incompatible. Type 'string' is not assignable to type 'number'. @@ -46,7 +47,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error Type 'string' is not assignable to type 'number'. -==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (18 errors) ==== +==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (19 errors) ==== interface StrNum extends Array { 0: string; 1: number; @@ -68,6 +69,8 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error var [g, h, i] = z; ~~~~~~~~~ !!! error TS2461: Type '{ 0: string; 1: number; }' is not an array type. + ~ +!!! error TS2460: Type '{ 0: string; 1: number; }' has no property '2'. var j1: [number, number, number] = x; ~~ !!! error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'. From a74d64baa6e7bddefafdfe495ec0b12250248afa Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 16 Jul 2015 19:03:15 -0700 Subject: [PATCH 3/3] Add tests --- tests/baselines/reference/tupleElementTypes1.js | 5 +++++ tests/baselines/reference/tupleElementTypes1.symbols | 7 +++++++ tests/baselines/reference/tupleElementTypes1.types | 8 ++++++++ tests/baselines/reference/tupleElementTypes2.js | 7 +++++++ tests/baselines/reference/tupleElementTypes2.symbols | 6 ++++++ tests/baselines/reference/tupleElementTypes2.types | 6 ++++++ tests/baselines/reference/tupleElementTypes3.js | 5 +++++ tests/baselines/reference/tupleElementTypes3.symbols | 6 ++++++ tests/baselines/reference/tupleElementTypes3.types | 8 ++++++++ tests/baselines/reference/tupleElementTypes4.js | 7 +++++++ tests/baselines/reference/tupleElementTypes4.symbols | 7 +++++++ tests/baselines/reference/tupleElementTypes4.types | 9 +++++++++ .../cases/conformance/types/tuple/tupleElementTypes1.ts | 1 + .../cases/conformance/types/tuple/tupleElementTypes2.ts | 1 + .../cases/conformance/types/tuple/tupleElementTypes3.ts | 1 + .../cases/conformance/types/tuple/tupleElementTypes4.ts | 1 + 16 files changed, 85 insertions(+) create mode 100644 tests/baselines/reference/tupleElementTypes1.js create mode 100644 tests/baselines/reference/tupleElementTypes1.symbols create mode 100644 tests/baselines/reference/tupleElementTypes1.types create mode 100644 tests/baselines/reference/tupleElementTypes2.js create mode 100644 tests/baselines/reference/tupleElementTypes2.symbols create mode 100644 tests/baselines/reference/tupleElementTypes2.types create mode 100644 tests/baselines/reference/tupleElementTypes3.js create mode 100644 tests/baselines/reference/tupleElementTypes3.symbols create mode 100644 tests/baselines/reference/tupleElementTypes3.types create mode 100644 tests/baselines/reference/tupleElementTypes4.js create mode 100644 tests/baselines/reference/tupleElementTypes4.symbols create mode 100644 tests/baselines/reference/tupleElementTypes4.types create mode 100644 tests/cases/conformance/types/tuple/tupleElementTypes1.ts create mode 100644 tests/cases/conformance/types/tuple/tupleElementTypes2.ts create mode 100644 tests/cases/conformance/types/tuple/tupleElementTypes3.ts create mode 100644 tests/cases/conformance/types/tuple/tupleElementTypes4.ts diff --git a/tests/baselines/reference/tupleElementTypes1.js b/tests/baselines/reference/tupleElementTypes1.js new file mode 100644 index 00000000000..be220d5021c --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes1.js @@ -0,0 +1,5 @@ +//// [tupleElementTypes1.ts] +var [a, b]: [number, any] = [undefined, undefined]; + +//// [tupleElementTypes1.js] +var _a = [undefined, undefined], a = _a[0], b = _a[1]; diff --git a/tests/baselines/reference/tupleElementTypes1.symbols b/tests/baselines/reference/tupleElementTypes1.symbols new file mode 100644 index 00000000000..1d27232a2a5 --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes1.symbols @@ -0,0 +1,7 @@ +=== tests/cases/conformance/types/tuple/tupleElementTypes1.ts === +var [a, b]: [number, any] = [undefined, undefined]; +>a : Symbol(a, Decl(tupleElementTypes1.ts, 0, 5)) +>b : Symbol(b, Decl(tupleElementTypes1.ts, 0, 7)) +>undefined : Symbol(undefined) +>undefined : Symbol(undefined) + diff --git a/tests/baselines/reference/tupleElementTypes1.types b/tests/baselines/reference/tupleElementTypes1.types new file mode 100644 index 00000000000..3b0b8b6e854 --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes1.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/types/tuple/tupleElementTypes1.ts === +var [a, b]: [number, any] = [undefined, undefined]; +>a : number +>b : any +>[undefined, undefined] : [undefined, undefined] +>undefined : undefined +>undefined : undefined + diff --git a/tests/baselines/reference/tupleElementTypes2.js b/tests/baselines/reference/tupleElementTypes2.js new file mode 100644 index 00000000000..56a7b1c889e --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes2.js @@ -0,0 +1,7 @@ +//// [tupleElementTypes2.ts] +function f([a, b]: [number, any]) { } + +//// [tupleElementTypes2.js] +function f(_a) { + var a = _a[0], b = _a[1]; +} diff --git a/tests/baselines/reference/tupleElementTypes2.symbols b/tests/baselines/reference/tupleElementTypes2.symbols new file mode 100644 index 00000000000..0eae02320d4 --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes2.symbols @@ -0,0 +1,6 @@ +=== tests/cases/conformance/types/tuple/tupleElementTypes2.ts === +function f([a, b]: [number, any]) { } +>f : Symbol(f, Decl(tupleElementTypes2.ts, 0, 0)) +>a : Symbol(a, Decl(tupleElementTypes2.ts, 0, 12)) +>b : Symbol(b, Decl(tupleElementTypes2.ts, 0, 14)) + diff --git a/tests/baselines/reference/tupleElementTypes2.types b/tests/baselines/reference/tupleElementTypes2.types new file mode 100644 index 00000000000..978df27d6b6 --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes2.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/types/tuple/tupleElementTypes2.ts === +function f([a, b]: [number, any]) { } +>f : ([a, b]: [number, any]) => void +>a : number +>b : any + diff --git a/tests/baselines/reference/tupleElementTypes3.js b/tests/baselines/reference/tupleElementTypes3.js new file mode 100644 index 00000000000..a8db914137b --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes3.js @@ -0,0 +1,5 @@ +//// [tupleElementTypes3.ts] +var [a, b] = [0, undefined]; + +//// [tupleElementTypes3.js] +var _a = [0, undefined], a = _a[0], b = _a[1]; diff --git a/tests/baselines/reference/tupleElementTypes3.symbols b/tests/baselines/reference/tupleElementTypes3.symbols new file mode 100644 index 00000000000..bf4eb78a219 --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes3.symbols @@ -0,0 +1,6 @@ +=== tests/cases/conformance/types/tuple/tupleElementTypes3.ts === +var [a, b] = [0, undefined]; +>a : Symbol(a, Decl(tupleElementTypes3.ts, 0, 5)) +>b : Symbol(b, Decl(tupleElementTypes3.ts, 0, 7)) +>undefined : Symbol(undefined) + diff --git a/tests/baselines/reference/tupleElementTypes3.types b/tests/baselines/reference/tupleElementTypes3.types new file mode 100644 index 00000000000..6f29ba1371a --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes3.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/types/tuple/tupleElementTypes3.ts === +var [a, b] = [0, undefined]; +>a : number +>b : any +>[0, undefined] : [number, undefined] +>0 : number +>undefined : undefined + diff --git a/tests/baselines/reference/tupleElementTypes4.js b/tests/baselines/reference/tupleElementTypes4.js new file mode 100644 index 00000000000..58c5b3f31ae --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes4.js @@ -0,0 +1,7 @@ +//// [tupleElementTypes4.ts] +function f([a, b] = [0, undefined]) { } + +//// [tupleElementTypes4.js] +function f(_a) { + var _b = _a === void 0 ? [0, undefined] : _a, a = _b[0], b = _b[1]; +} diff --git a/tests/baselines/reference/tupleElementTypes4.symbols b/tests/baselines/reference/tupleElementTypes4.symbols new file mode 100644 index 00000000000..86b901e4d04 --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes4.symbols @@ -0,0 +1,7 @@ +=== tests/cases/conformance/types/tuple/tupleElementTypes4.ts === +function f([a, b] = [0, undefined]) { } +>f : Symbol(f, Decl(tupleElementTypes4.ts, 0, 0)) +>a : Symbol(a, Decl(tupleElementTypes4.ts, 0, 12)) +>b : Symbol(b, Decl(tupleElementTypes4.ts, 0, 14)) +>undefined : Symbol(undefined) + diff --git a/tests/baselines/reference/tupleElementTypes4.types b/tests/baselines/reference/tupleElementTypes4.types new file mode 100644 index 00000000000..06e19ef72bb --- /dev/null +++ b/tests/baselines/reference/tupleElementTypes4.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/types/tuple/tupleElementTypes4.ts === +function f([a, b] = [0, undefined]) { } +>f : ([a, b]?: [number, any]) => void +>a : number +>b : any +>[0, undefined] : [number, undefined] +>0 : number +>undefined : undefined + diff --git a/tests/cases/conformance/types/tuple/tupleElementTypes1.ts b/tests/cases/conformance/types/tuple/tupleElementTypes1.ts new file mode 100644 index 00000000000..60772a30f66 --- /dev/null +++ b/tests/cases/conformance/types/tuple/tupleElementTypes1.ts @@ -0,0 +1 @@ +var [a, b]: [number, any] = [undefined, undefined]; \ No newline at end of file diff --git a/tests/cases/conformance/types/tuple/tupleElementTypes2.ts b/tests/cases/conformance/types/tuple/tupleElementTypes2.ts new file mode 100644 index 00000000000..aff6b569a88 --- /dev/null +++ b/tests/cases/conformance/types/tuple/tupleElementTypes2.ts @@ -0,0 +1 @@ +function f([a, b]: [number, any]) { } \ No newline at end of file diff --git a/tests/cases/conformance/types/tuple/tupleElementTypes3.ts b/tests/cases/conformance/types/tuple/tupleElementTypes3.ts new file mode 100644 index 00000000000..7ff2fd47f65 --- /dev/null +++ b/tests/cases/conformance/types/tuple/tupleElementTypes3.ts @@ -0,0 +1 @@ +var [a, b] = [0, undefined]; \ No newline at end of file diff --git a/tests/cases/conformance/types/tuple/tupleElementTypes4.ts b/tests/cases/conformance/types/tuple/tupleElementTypes4.ts new file mode 100644 index 00000000000..9d5d0277b44 --- /dev/null +++ b/tests/cases/conformance/types/tuple/tupleElementTypes4.ts @@ -0,0 +1 @@ +function f([a, b] = [0, undefined]) { } \ No newline at end of file