Skip to content

Commit 0e7ffda

Browse files
committed
Add empty tuple type
1 parent ea57fbc commit 0e7ffda

14 files changed

+153
-55
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 8 deletions
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 = createTupleType([]);
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

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 4 additions & 0 deletions
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+
Lines changed: 4 additions & 0 deletions
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

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

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
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+
Lines changed: 13 additions & 0 deletions
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

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
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+

0 commit comments

Comments
 (0)