Skip to content

Commit fbe60c9

Browse files
committed
Merge pull request microsoft#3902 from Microsoft/tupleTypesAny
Don't fall back to any when typing tuples
2 parents 33794b7 + 27c339a commit fbe60c9

18 files changed

+89
-5
lines changed

src/compiler/checker.ts

-4
Original file line numberDiff line numberDiff line change
@@ -2274,10 +2274,6 @@ namespace ts {
22742274
// fact an iterable or array (depending on target language).
22752275
let elementType = checkIteratedTypeOrElementType(parentType, pattern, /*allowStringInput*/ false);
22762276
if (!declaration.dotDotDotToken) {
2277-
if (isTypeAny(elementType)) {
2278-
return elementType;
2279-
}
2280-
22812277
// Use specific property type when parent is a tuple or numeric index type when parent is an array
22822278
let propName = "" + indexOf(pattern.elements, declaration);
22832279
type = isTupleLikeType(parentType)

tests/baselines/reference/arityAndOrderCompatibility01.errors.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
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'.
22
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(14,12): error TS2460: Type 'StrNum' has no property '2'.
33
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,5): error TS2461: Type '{ 0: string; 1: number; }' is not an array type.
4+
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,12): error TS2460: Type '{ 0: string; 1: number; }' has no property '2'.
45
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(16,5): error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'.
56
Types of property '0' are incompatible.
67
Type 'string' is not assignable to type 'number'.
@@ -46,7 +47,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error
4647
Type 'string' is not assignable to type 'number'.
4748

4849

49-
==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (18 errors) ====
50+
==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (19 errors) ====
5051
interface StrNum extends Array<string|number> {
5152
0: string;
5253
1: number;
@@ -68,6 +69,8 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error
6869
var [g, h, i] = z;
6970
~~~~~~~~~
7071
!!! error TS2461: Type '{ 0: string; 1: number; }' is not an array type.
72+
~
73+
!!! error TS2460: Type '{ 0: string; 1: number; }' has no property '2'.
7174
var j1: [number, number, number] = x;
7275
~~
7376
!!! error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//// [tupleElementTypes1.ts]
2+
var [a, b]: [number, any] = [undefined, undefined];
3+
4+
//// [tupleElementTypes1.js]
5+
var _a = [undefined, undefined], a = _a[0], b = _a[1];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
=== tests/cases/conformance/types/tuple/tupleElementTypes1.ts ===
2+
var [a, b]: [number, any] = [undefined, undefined];
3+
>a : Symbol(a, Decl(tupleElementTypes1.ts, 0, 5))
4+
>b : Symbol(b, Decl(tupleElementTypes1.ts, 0, 7))
5+
>undefined : Symbol(undefined)
6+
>undefined : Symbol(undefined)
7+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== tests/cases/conformance/types/tuple/tupleElementTypes1.ts ===
2+
var [a, b]: [number, any] = [undefined, undefined];
3+
>a : number
4+
>b : any
5+
>[undefined, undefined] : [undefined, undefined]
6+
>undefined : undefined
7+
>undefined : undefined
8+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//// [tupleElementTypes2.ts]
2+
function f([a, b]: [number, any]) { }
3+
4+
//// [tupleElementTypes2.js]
5+
function f(_a) {
6+
var a = _a[0], b = _a[1];
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
=== tests/cases/conformance/types/tuple/tupleElementTypes2.ts ===
2+
function f([a, b]: [number, any]) { }
3+
>f : Symbol(f, Decl(tupleElementTypes2.ts, 0, 0))
4+
>a : Symbol(a, Decl(tupleElementTypes2.ts, 0, 12))
5+
>b : Symbol(b, Decl(tupleElementTypes2.ts, 0, 14))
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
=== tests/cases/conformance/types/tuple/tupleElementTypes2.ts ===
2+
function f([a, b]: [number, any]) { }
3+
>f : ([a, b]: [number, any]) => void
4+
>a : number
5+
>b : any
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//// [tupleElementTypes3.ts]
2+
var [a, b] = [0, undefined];
3+
4+
//// [tupleElementTypes3.js]
5+
var _a = [0, undefined], a = _a[0], b = _a[1];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
=== tests/cases/conformance/types/tuple/tupleElementTypes3.ts ===
2+
var [a, b] = [0, undefined];
3+
>a : Symbol(a, Decl(tupleElementTypes3.ts, 0, 5))
4+
>b : Symbol(b, Decl(tupleElementTypes3.ts, 0, 7))
5+
>undefined : Symbol(undefined)
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== tests/cases/conformance/types/tuple/tupleElementTypes3.ts ===
2+
var [a, b] = [0, undefined];
3+
>a : number
4+
>b : any
5+
>[0, undefined] : [number, undefined]
6+
>0 : number
7+
>undefined : undefined
8+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//// [tupleElementTypes4.ts]
2+
function f([a, b] = [0, undefined]) { }
3+
4+
//// [tupleElementTypes4.js]
5+
function f(_a) {
6+
var _b = _a === void 0 ? [0, undefined] : _a, a = _b[0], b = _b[1];
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
=== tests/cases/conformance/types/tuple/tupleElementTypes4.ts ===
2+
function f([a, b] = [0, undefined]) { }
3+
>f : Symbol(f, Decl(tupleElementTypes4.ts, 0, 0))
4+
>a : Symbol(a, Decl(tupleElementTypes4.ts, 0, 12))
5+
>b : Symbol(b, Decl(tupleElementTypes4.ts, 0, 14))
6+
>undefined : Symbol(undefined)
7+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/conformance/types/tuple/tupleElementTypes4.ts ===
2+
function f([a, b] = [0, undefined]) { }
3+
>f : ([a, b]?: [number, any]) => void
4+
>a : number
5+
>b : any
6+
>[0, undefined] : [number, undefined]
7+
>0 : number
8+
>undefined : undefined
9+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
var [a, b]: [number, any] = [undefined, undefined];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
function f([a, b]: [number, any]) { }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
var [a, b] = [0, undefined];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
function f([a, b] = [0, undefined]) { }

0 commit comments

Comments
 (0)