Skip to content

Commit f0385d3

Browse files
committed
Add empty tuple type
1 parent ea57fbc commit f0385d3

14 files changed

+153
-55
lines changed

src/compiler/checker.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ namespace ts {
294294

295295
const emptyStringType = getLiteralTypeForText(TypeFlags.StringLiteral, "");
296296
const zeroType = getLiteralTypeForText(TypeFlags.NumberLiteral, "0");
297+
const emptyTupleType = getTupleTypeOfArity(0).instantiations.get(getTypeListId([]));
297298

298299
const resolutionTargets: TypeSystemEntity[] = [];
299300
const resolutionResults: boolean[] = [];
@@ -8910,7 +8911,11 @@ namespace ts {
89108911
}
89118912

89128913
function isTupleLikeType(type: Type): boolean {
8913-
return !!getPropertyOfType(type, "0");
8914+
return !!getPropertyOfType(type, "0") || isEmptyTupleType(type);
8915+
}
8916+
8917+
function isEmptyTupleType(type: Type): boolean {
8918+
return emptyTupleType.id == type.id;
89148919
}
89158920

89168921
function isUnitType(type: Type): boolean {
@@ -12191,9 +12196,7 @@ namespace ts {
1219112196
}
1219212197
}
1219312198
}
12194-
if (elementTypes.length) {
12195-
return createTupleType(elementTypes);
12196-
}
12199+
return createTupleType(elementTypes);
1219712200
}
1219812201
}
1219912202
return createArrayType(elementTypes.length ?
@@ -17115,10 +17118,7 @@ namespace ts {
1711517118

1711617119
function checkTupleType(node: TupleTypeNode) {
1711717120
// Grammar checking
17118-
const hasErrorFromDisallowedTrailingComma = checkGrammarForDisallowedTrailingComma(node.elementTypes);
17119-
if (!hasErrorFromDisallowedTrailingComma && node.elementTypes.length === 0) {
17120-
grammarErrorOnNode(node, Diagnostics.A_tuple_type_element_list_cannot_be_empty);
17121-
}
17121+
checkGrammarForDisallowedTrailingComma(node.elementTypes);
1712217122

1712317123
forEach(node.elementTypes, checkSourceElement);
1712417124
}

tests/baselines/reference/TupleType3.errors.txt

-7
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
=== tests/cases/conformance/parser/ecmascript5/TupleTypes/TupleType3.ts ===
2+
var v: []
3+
>v : Symbol(v, Decl(TupleType3.ts, 0, 3))
4+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
=== tests/cases/conformance/parser/ecmascript5/TupleTypes/TupleType3.ts ===
2+
var v: []
3+
>v : []
4+

tests/baselines/reference/arrayLiterals3.errors.txt

+4-4
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.errors.txt

-9
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion01.ts ===
2+
3+
let x = <[]>[];
4+
>x : Symbol(x, Decl(emptyTuplesTypeAssertion01.ts, 1, 3))
5+
6+
let y = x[0];
7+
>y : Symbol(y, Decl(emptyTuplesTypeAssertion01.ts, 2, 3))
8+
>x : Symbol(x, Decl(emptyTuplesTypeAssertion01.ts, 1, 3))
9+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion01.ts ===
2+
3+
let x = <[]>[];
4+
>x : []
5+
><[]>[] : []
6+
>[] : []
7+
8+
let y = x[0];
9+
>y : never
10+
>x[0] : never
11+
>x : []
12+
>0 : 0
13+

tests/baselines/reference/emptyTuplesTypeAssertion02.errors.txt

-9
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts ===
2+
3+
let x = [] as [];
4+
>x : Symbol(x, Decl(emptyTuplesTypeAssertion02.ts, 1, 3))
5+
6+
let y = x[0];
7+
>y : Symbol(y, Decl(emptyTuplesTypeAssertion02.ts, 2, 3))
8+
>x : Symbol(x, Decl(emptyTuplesTypeAssertion02.ts, 1, 3))
9+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts ===
2+
3+
let x = [] as [];
4+
>x : []
5+
>[] as [] : []
6+
>[] : []
7+
8+
let y = x[0];
9+
>y : never
10+
>x[0] : never
11+
>x : []
12+
>0 : 0
13+

tests/baselines/reference/tupleTypes.errors.txt

+52-15
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,40 @@
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[]'.
1+
tests/cases/compiler/tupleTypes.ts(14,1): error TS2322: Type '[]' is not assignable to type '[number, string]'.
2+
Property '0' is missing in type '[]'.
43
tests/cases/compiler/tupleTypes.ts(15,1): error TS2322: Type '[number]' is not assignable to type '[number, string]'.
54
Property '1' is missing in type '[number]'.
65
tests/cases/compiler/tupleTypes.ts(17,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]];
@@ -40,8 +49,8 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n
4049

4150
t = []; // Error
4251
~
43-
!!! error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'.
44-
!!! error TS2322: Property '0' is missing in type 'undefined[]'.
52+
!!! error TS2322: Type '[]' is not assignable to type '[number, string]'.
53+
!!! error TS2322: Property '0' is missing in type '[]'.
4554
t = [1]; // Error
4655
~
4756
!!! error TS2322: Type '[number]' is not assignable to type '[number, string]'.
@@ -53,6 +62,18 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n
5362
!!! error TS2322: Type 'string' is not assignable to type 'number'.
5463
t = [1, "hello", 2]; // Ok
5564

65+
var et: [];
66+
var et0 = et[0]; // never
67+
var et0: never;
68+
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

+24-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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]];
@@ -18,6 +18,13 @@ 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+
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,17 +52,22 @@ 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;
@@ -71,6 +83,11 @@ t = [1]; // Error
7183
t = [1, "hello"]; // Ok
7284
t = ["hello", 1]; // Error
7385
t = [1, "hello", 2]; // Ok
86+
var et;
87+
var et0 = et[0]; // never
88+
var et0;
89+
et = []; // Ok
90+
et = [1]; // Error
7491
var tf = ["hello", function (x) { return x.length; }];
7592
var ff1 = ff("hello", ["foo", function (x) { return x.length; }]);
7693
var ff1;
@@ -92,10 +109,15 @@ var a;
92109
var a1;
93110
var a2;
94111
var a3;
112+
var a4;
95113
a = a1; // Error
96114
a = a2;
97115
a = a3; // Error
116+
a = a4;
98117
a1 = a2; // Error
99118
a1 = a3; // Error
119+
a1 = a4; // Error
100120
a3 = a1;
101121
a3 = a2;
122+
a3 = a4; // Error
123+
a4 = a1; // Error

tests/cases/compiler/tupleTypes.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var v1: []; // Error
1+
var v1: [];
22
var v2: [number];
33
var v3: [number, string];
44
var v4: [number, [string, string]];
@@ -17,6 +17,13 @@ t = [1, "hello"]; // Ok
1717
t = ["hello", 1]; // Error
1818
t = [1, "hello", 2]; // Ok
1919

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

2229
declare function ff<T, U>(a: T, b: [T, (x: T) => U]): U;
@@ -44,10 +51,15 @@ var a: number[];
4451
var a1: [number, string];
4552
var a2: [number, number];
4653
var a3: [number, {}];
54+
var a4: [];
4755
a = a1; // Error
4856
a = a2;
4957
a = a3; // Error
58+
a = a4;
5059
a1 = a2; // Error
5160
a1 = a3; // Error
61+
a1 = a4; // Error
5262
a3 = a1;
5363
a3 = a2;
64+
a3 = a4; // Error
65+
a4 = a1; // Error

0 commit comments

Comments
 (0)