Skip to content

Commit 03bf0b8

Browse files
empty tuple tests all good
1 parent 665f44f commit 03bf0b8

11 files changed

+154
-37
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2640,13 +2640,8 @@ namespace ts {
26402640
return createArrayTypeNode(elementType);
26412641
}
26422642
else if (type.target.objectFlags & ObjectFlags.Tuple) {
2643-
if (typeArguments.length > 0) {
2644-
const tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, getTypeReferenceArity(type)), context);
2645-
if (tupleConstituentNodes && tupleConstituentNodes.length > 0) {
2646-
return createTupleTypeNode(tupleConstituentNodes);
2647-
}
2648-
}
2649-
return createTupleTypeNode([]);
2643+
const tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, getTypeReferenceArity(type)), context);
2644+
return createTupleTypeNode(tupleConstituentNodes);
26502645
}
26512646
else {
26522647
const outerTypeParameters = type.target.outerTypeParameters;
@@ -9987,7 +9982,7 @@ namespace ts {
99879982
}
99889983

99899984
function isTupleLikeType(type: Type): boolean {
9990-
return !!getPropertyOfType(type, "0" as __String);
9985+
return !!getPropertyOfType(type, "0" as __String) || type === getTupleTypeOfArity(0);
99919986
}
99929987

99939988
function isUnitType(type: Type): boolean {
@@ -13372,9 +13367,7 @@ namespace ts {
1337213367
}
1337313368
}
1337413369
}
13375-
if (elementTypes.length) {
13376-
return createTupleType(elementTypes);
13377-
}
13370+
return createTupleType(elementTypes);
1337813371
}
1337913372
}
1338013373
return createArrayType(elementTypes.length ?
@@ -18732,7 +18725,7 @@ namespace ts {
1873218725

1873318726
function checkTupleType(node: TupleTypeNode) {
1873418727
// Grammar checking
18735-
const hasErrorFromDisallowedTrailingComma = checkGrammarForDisallowedTrailingComma(node.elementTypes);
18728+
checkGrammarForDisallowedTrailingComma(node.elementTypes);
1873618729
forEach(node.elementTypes, checkSourceElement);
1873718730
}
1873818731

tests/baselines/reference/arrayLiterals3.errors.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(10,5): error TS2322: Type 'undefined[]' is not assignable to type '[any, any, any]'.
2-
Property '0' is missing in type 'undefined[]'.
1+
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(10,5): error TS2322: Type '[]' is not assignable to type '[any, any, any]'.
2+
Property '0' is missing in type '[]'.
33
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(11,5): error TS2322: Type '["string", number, boolean]' is not assignable to type '[boolean, string, number]'.
44
Type '"string"' is not assignable to type 'boolean'.
55
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(17,5): error TS2322: Type '[number, number, string, boolean]' is not assignable to type '[number, number]'.
@@ -32,8 +32,8 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error
3232

3333
var a0: [any, any, any] = []; // Error
3434
~~
35-
!!! error TS2322: Type 'undefined[]' is not assignable to type '[any, any, any]'.
36-
!!! error TS2322: Property '0' is missing in type 'undefined[]'.
35+
!!! error TS2322: Type '[]' is not assignable to type '[any, any, any]'.
36+
!!! error TS2322: Property '0' is missing in type '[]'.
3737
var a1: [boolean, string, number] = ["string", 1, true]; // Error
3838
~~
3939
!!! error TS2322: Type '["string", number, boolean]' is not assignable to type '[boolean, string, number]'.

tests/baselines/reference/emptyTuplesTypeAssertion01.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
let x = <[]>[];
33
>x : []
44
><[]>[] : []
5-
>[] : undefined[]
5+
>[] : []
66

77
let y = x[0];
88
>y : never

tests/baselines/reference/emptyTuplesTypeAssertion02.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
let x = [] as [];
33
>x : []
44
>[] as [] : []
5-
>[] : undefined[]
5+
>[] : []
66

77
let y = x[0];
88
>y : never

tests/baselines/reference/tupleTypes.errors.txt

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,44 @@
1-
tests/cases/compiler/tupleTypes.ts(1,9): error TS1122: A tuple type element list cannot be empty.
2-
tests/cases/compiler/tupleTypes.ts(14,1): error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'.
3-
Property '0' is missing in type 'undefined[]'.
4-
tests/cases/compiler/tupleTypes.ts(15,1): error TS2322: Type '[number]' is not assignable to type '[number, string]'.
1+
tests/cases/compiler/tupleTypes.ts(15,1): error TS2322: Type '[]' is not assignable to type '[number, string]'.
2+
Property '0' is missing in type '[]'.
3+
tests/cases/compiler/tupleTypes.ts(16,1): error TS2322: Type '[number]' is not assignable to type '[number, string]'.
54
Property '1' is missing in type '[number]'.
6-
tests/cases/compiler/tupleTypes.ts(17,1): error TS2322: Type '[string, number]' is not assignable to type '[number, string]'.
5+
tests/cases/compiler/tupleTypes.ts(18,1): error TS2322: Type '[string, number]' is not assignable to type '[number, string]'.
76
Type 'string' is not assignable to type 'number'.
8-
tests/cases/compiler/tupleTypes.ts(41,1): error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'.
9-
tests/cases/compiler/tupleTypes.ts(47,1): error TS2322: Type '[number, string]' is not assignable to type 'number[]'.
7+
tests/cases/compiler/tupleTypes.ts(25,1): error TS2322: Type '[number]' is not assignable to type '[]'.
8+
Types of property 'pop' are incompatible.
9+
Type '() => number' is not assignable to type '() => never'.
10+
Type 'number' is not assignable to type 'never'.
11+
tests/cases/compiler/tupleTypes.ts(48,1): error TS2322: Type '[]' is not assignable to type '[number, string]'.
12+
tests/cases/compiler/tupleTypes.ts(55,1): error TS2322: Type '[number, string]' is not assignable to type 'number[]'.
1013
Types of property 'pop' are incompatible.
1114
Type '() => string | number' is not assignable to type '() => number'.
1215
Type 'string | number' is not assignable to type 'number'.
1316
Type 'string' is not assignable to type 'number'.
14-
tests/cases/compiler/tupleTypes.ts(49,1): error TS2322: Type '[number, {}]' is not assignable to type 'number[]'.
17+
tests/cases/compiler/tupleTypes.ts(57,1): error TS2322: Type '[number, {}]' is not assignable to type 'number[]'.
1518
Types of property 'pop' are incompatible.
1619
Type '() => number | {}' is not assignable to type '() => number'.
1720
Type 'number | {}' is not assignable to type 'number'.
1821
Type '{}' is not assignable to type 'number'.
19-
tests/cases/compiler/tupleTypes.ts(50,1): error TS2322: Type '[number, number]' is not assignable to type '[number, string]'.
22+
tests/cases/compiler/tupleTypes.ts(59,1): error TS2322: Type '[number, number]' is not assignable to type '[number, string]'.
2023
Type 'number' is not assignable to type 'string'.
21-
tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is not assignable to type '[number, string]'.
24+
tests/cases/compiler/tupleTypes.ts(60,1): error TS2322: Type '[number, {}]' is not assignable to type '[number, string]'.
2225
Type '{}' is not assignable to type 'string'.
26+
tests/cases/compiler/tupleTypes.ts(61,1): error TS2322: Type '[]' is not assignable to type '[number, string]'.
27+
tests/cases/compiler/tupleTypes.ts(64,1): error TS2322: Type '[]' is not assignable to type '[number, {}]'.
28+
Property '0' is missing in type '[]'.
29+
tests/cases/compiler/tupleTypes.ts(65,1): error TS2322: Type '[number, string]' is not assignable to type '[]'.
30+
Types of property 'pop' are incompatible.
31+
Type '() => string | number' is not assignable to type '() => never'.
32+
Type 'string | number' is not assignable to type 'never'.
33+
Type 'string' is not assignable to type 'never'.
2334

2435

25-
==== tests/cases/compiler/tupleTypes.ts (9 errors) ====
26-
var v1: []; // Error
27-
~~
28-
!!! error TS1122: A tuple type element list cannot be empty.
36+
==== tests/cases/compiler/tupleTypes.ts (12 errors) ====
37+
var v1: [] = [];
2938
var v2: [number];
3039
var v3: [number, string];
3140
var v4: [number, [string, string]];
41+
var v5: number[] = v1;
3242

3343
var t: [number, string];
3444
var t0 = t[0]; // number
@@ -40,8 +50,8 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n
4050

4151
t = []; // Error
4252
~
43-
!!! error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'.
44-
!!! error TS2322: Property '0' is missing in type 'undefined[]'.
53+
!!! error TS2322: Type '[]' is not assignable to type '[number, string]'.
54+
!!! error TS2322: Property '0' is missing in type '[]'.
4555
t = [1]; // Error
4656
~
4757
!!! error TS2322: Type '[number]' is not assignable to type '[number, string]'.
@@ -53,6 +63,17 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n
5363
!!! error TS2322: Type 'string' is not assignable to type 'number'.
5464
t = [1, "hello", 2]; // Ok
5565

66+
var et: [];
67+
var et0 = et[0]; // never
68+
var et0: never;
69+
et = []; // Ok
70+
et = [1]; // Error
71+
~~
72+
!!! error TS2322: Type '[number]' is not assignable to type '[]'.
73+
!!! error TS2322: Types of property 'pop' are incompatible.
74+
!!! error TS2322: Type '() => number' is not assignable to type '() => never'.
75+
!!! error TS2322: Type 'number' is not assignable to type 'never'.
76+
5677
var tf: [string, (x: string) => number] = ["hello", x => x.length];
5778

5879
declare function ff<T, U>(a: T, b: [T, (x: T) => U]): U;
@@ -76,12 +97,13 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n
7697
tt = [undefined, undefined];
7798
tt = []; // Error
7899
~~
79-
!!! error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'.
100+
!!! error TS2322: Type '[]' is not assignable to type '[number, string]'.
80101

81102
var a: number[];
82103
var a1: [number, string];
83104
var a2: [number, number];
84105
var a3: [number, {}];
106+
var a4: [];
85107
a = a1; // Error
86108
~
87109
!!! error TS2322: Type '[number, string]' is not assignable to type 'number[]'.
@@ -97,6 +119,7 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n
97119
!!! error TS2322: Type '() => number | {}' is not assignable to type '() => number'.
98120
!!! error TS2322: Type 'number | {}' is not assignable to type 'number'.
99121
!!! error TS2322: Type '{}' is not assignable to type 'number'.
122+
a = a4;
100123
a1 = a2; // Error
101124
~~
102125
!!! error TS2322: Type '[number, number]' is not assignable to type '[number, string]'.
@@ -105,6 +128,20 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n
105128
~~
106129
!!! error TS2322: Type '[number, {}]' is not assignable to type '[number, string]'.
107130
!!! error TS2322: Type '{}' is not assignable to type 'string'.
131+
a1 = a4; // Error
132+
~~
133+
!!! error TS2322: Type '[]' is not assignable to type '[number, string]'.
108134
a3 = a1;
109135
a3 = a2;
136+
a3 = a4; // Error
137+
~~
138+
!!! error TS2322: Type '[]' is not assignable to type '[number, {}]'.
139+
!!! error TS2322: Property '0' is missing in type '[]'.
140+
a4 = a1; // Error
141+
~~
142+
!!! error TS2322: Type '[number, string]' is not assignable to type '[]'.
143+
!!! error TS2322: Types of property 'pop' are incompatible.
144+
!!! error TS2322: Type '() => string | number' is not assignable to type '() => never'.
145+
!!! error TS2322: Type 'string | number' is not assignable to type 'never'.
146+
!!! error TS2322: Type 'string' is not assignable to type 'never'.
110147

tests/baselines/reference/tupleTypes.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
//// [tupleTypes.ts]
2-
var v1: []; // Error
2+
var v1: [] = [];
33
var v2: [number];
44
var v3: [number, string];
55
var v4: [number, [string, string]];
6+
var v5: number[] = v1;
67

78
var t: [number, string];
89
var t0 = t[0]; // number
@@ -18,6 +19,12 @@ t = [1, "hello"]; // Ok
1819
t = ["hello", 1]; // Error
1920
t = [1, "hello", 2]; // Ok
2021

22+
var et: [];
23+
var et0 = et[0]; // never
24+
var et0: never;
25+
et = []; // Ok
26+
et = [1]; // Error
27+
2128
var tf: [string, (x: string) => number] = ["hello", x => x.length];
2229

2330
declare function ff<T, U>(a: T, b: [T, (x: T) => U]): U;
@@ -45,20 +52,26 @@ var a: number[];
4552
var a1: [number, string];
4653
var a2: [number, number];
4754
var a3: [number, {}];
55+
var a4: [];
4856
a = a1; // Error
4957
a = a2;
5058
a = a3; // Error
59+
a = a4;
5160
a1 = a2; // Error
5261
a1 = a3; // Error
62+
a1 = a4; // Error
5363
a3 = a1;
5464
a3 = a2;
65+
a3 = a4; // Error
66+
a4 = a1; // Error
5567

5668

5769
//// [tupleTypes.js]
58-
var v1; // Error
70+
var v1 = [];
5971
var v2;
6072
var v3;
6173
var v4;
74+
var v5 = v1;
6275
var t;
6376
var t0 = t[0]; // number
6477
var t0;
@@ -71,6 +84,11 @@ t = [1]; // Error
7184
t = [1, "hello"]; // Ok
7285
t = ["hello", 1]; // Error
7386
t = [1, "hello", 2]; // Ok
87+
var et;
88+
var et0 = et[0]; // never
89+
var et0;
90+
et = []; // Ok
91+
et = [1]; // Error
7492
var tf = ["hello", function (x) { return x.length; }];
7593
var ff1 = ff("hello", ["foo", function (x) { return x.length; }]);
7694
var ff1;
@@ -92,10 +110,15 @@ var a;
92110
var a1;
93111
var a2;
94112
var a3;
113+
var a4;
95114
a = a1; // Error
96115
a = a2;
97116
a = a3; // Error
117+
a = a4;
98118
a1 = a2; // Error
99119
a1 = a3; // Error
120+
a1 = a4; // Error
100121
a3 = a1;
101122
a3 = a2;
123+
a3 = a4; // Error
124+
a4 = a1; // Error
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//// [tupleTypesStrictNullChecks.ts]
2+
var et: [] = [];
3+
var et0 = et[0]; // never
4+
var et0: never;
5+
6+
et = []; // Ok
7+
8+
9+
//// [tupleTypesStrictNullChecks.js]
10+
var et = [];
11+
var et0 = et[0]; // never
12+
var et0;
13+
et = []; // Ok
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
=== tests/cases/compiler/tupleTypesStrictNullChecks.ts ===
2+
var et: [] = [];
3+
>et : Symbol(et, Decl(tupleTypesStrictNullChecks.ts, 0, 3))
4+
5+
var et0 = et[0]; // never
6+
>et0 : Symbol(et0, Decl(tupleTypesStrictNullChecks.ts, 1, 3), Decl(tupleTypesStrictNullChecks.ts, 2, 3))
7+
>et : Symbol(et, Decl(tupleTypesStrictNullChecks.ts, 0, 3))
8+
9+
var et0: never;
10+
>et0 : Symbol(et0, Decl(tupleTypesStrictNullChecks.ts, 1, 3), Decl(tupleTypesStrictNullChecks.ts, 2, 3))
11+
12+
et = []; // Ok
13+
>et : Symbol(et, Decl(tupleTypesStrictNullChecks.ts, 0, 3))
14+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
=== tests/cases/compiler/tupleTypesStrictNullChecks.ts ===
2+
var et: [] = [];
3+
>et : []
4+
>[] : []
5+
6+
var et0 = et[0]; // never
7+
>et0 : never
8+
>et[0] : never
9+
>et : []
10+
>0 : 0
11+
12+
var et0: never;
13+
>et0 : never
14+
15+
et = []; // Ok
16+
>et = [] : []
17+
>et : []
18+
>[] : []
19+

tests/cases/compiler/tupleTypes.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ t = [1, "hello"]; // Ok
1818
t = ["hello", 1]; // Error
1919
t = [1, "hello", 2]; // Ok
2020

21+
var et: [];
22+
var et0 = et[0]; // never
23+
var et0: never;
24+
et = []; // Ok
25+
et = [1]; // Error
26+
2127
var tf: [string, (x: string) => number] = ["hello", x => x.length];
2228

2329
declare function ff<T, U>(a: T, b: [T, (x: T) => U]): U;
@@ -45,10 +51,15 @@ var a: number[];
4551
var a1: [number, string];
4652
var a2: [number, number];
4753
var a3: [number, {}];
54+
var a4: [];
4855
a = a1; // Error
4956
a = a2;
5057
a = a3; // Error
58+
a = a4;
5159
a1 = a2; // Error
5260
a1 = a3; // Error
61+
a1 = a4; // Error
5362
a3 = a1;
5463
a3 = a2;
64+
a3 = a4; // Error
65+
a4 = a1; // Error
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// @strictNullChecks: true
2+
3+
var et: [] = [];
4+
var et0 = et[0]; // never
5+
var et0: never;
6+
7+
et = []; // Ok

0 commit comments

Comments
 (0)