Skip to content

Commit 9ae6350

Browse files
prepare Tuple interface for tuples
1 parent d03d107 commit 9ae6350

13 files changed

+140
-69
lines changed

src/compiler/checker.ts

+3
Original file line numberDiff line numberDiff line change
@@ -7178,6 +7178,9 @@ namespace ts {
71787178
type.declaredStringIndexInfo = undefined;
71797179
type.declaredNumberIndexInfo = undefined;
71807180
return type;
7181+
// let globalTupleType = <GenericType>getGlobalType("Tuple" as __String, /*arity*/ 2, /*reportErrors*/ true);
7182+
// let union = getUnionType(typeParameters);
7183+
// return createTypeFromGenericGlobalType(globalTupleType, [arity, union]);
71817184
}
71827185

71837186
function getTupleTypeOfArity(arity: number): GenericType {

src/lib/es5.d.ts

+7
Original file line numberDiff line numberDiff line change
@@ -1073,6 +1073,13 @@ interface ReadonlyArray<T> {
10731073
readonly [n: number]: T;
10741074
}
10751075

1076+
interface Tuple<TLength extends number, TUnion> extends ReadonlyArray<TUnion> {
1077+
/**
1078+
* Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.
1079+
*/
1080+
length: TLength;
1081+
}
1082+
10761083
interface Array<T> {
10771084
/**
10781085
* Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.

tests/baselines/reference/genericTypeAliases.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ type Strange<T> = string; // Type parameter not used
4040
var s: Strange<number>;
4141
s = "hello";
4242

43-
interface Tuple<A, B> {
43+
interface AB<A, B> {
4444
a: A;
4545
b: B;
4646
}
4747

48-
type Pair<T> = Tuple<T, T>;
48+
type Pair<T> = AB<T, T>;
4949

5050
interface TaggedPair<T> extends Pair<T> {
5151
tag: string;

tests/baselines/reference/genericTypeAliases.symbols

+16-16
Original file line numberDiff line numberDiff line change
@@ -124,29 +124,29 @@ var s: Strange<number>;
124124
s = "hello";
125125
>s : Symbol(s, Decl(genericTypeAliases.ts, 38, 3))
126126

127-
interface Tuple<A, B> {
128-
>Tuple : Symbol(Tuple, Decl(genericTypeAliases.ts, 39, 12))
129-
>A : Symbol(A, Decl(genericTypeAliases.ts, 41, 16))
130-
>B : Symbol(B, Decl(genericTypeAliases.ts, 41, 18))
127+
interface AB<A, B> {
128+
>AB : Symbol(AB, Decl(genericTypeAliases.ts, 39, 12))
129+
>A : Symbol(A, Decl(genericTypeAliases.ts, 41, 13))
130+
>B : Symbol(B, Decl(genericTypeAliases.ts, 41, 15))
131131

132132
a: A;
133-
>a : Symbol(Tuple.a, Decl(genericTypeAliases.ts, 41, 23))
134-
>A : Symbol(A, Decl(genericTypeAliases.ts, 41, 16))
133+
>a : Symbol(AB.a, Decl(genericTypeAliases.ts, 41, 20))
134+
>A : Symbol(A, Decl(genericTypeAliases.ts, 41, 13))
135135

136136
b: B;
137-
>b : Symbol(Tuple.b, Decl(genericTypeAliases.ts, 42, 9))
138-
>B : Symbol(B, Decl(genericTypeAliases.ts, 41, 18))
137+
>b : Symbol(AB.b, Decl(genericTypeAliases.ts, 42, 9))
138+
>B : Symbol(B, Decl(genericTypeAliases.ts, 41, 15))
139139
}
140140

141-
type Pair<T> = Tuple<T, T>;
141+
type Pair<T> = AB<T, T>;
142142
>Pair : Symbol(Pair, Decl(genericTypeAliases.ts, 44, 1))
143143
>T : Symbol(T, Decl(genericTypeAliases.ts, 46, 10))
144-
>Tuple : Symbol(Tuple, Decl(genericTypeAliases.ts, 39, 12))
144+
>AB : Symbol(AB, Decl(genericTypeAliases.ts, 39, 12))
145145
>T : Symbol(T, Decl(genericTypeAliases.ts, 46, 10))
146146
>T : Symbol(T, Decl(genericTypeAliases.ts, 46, 10))
147147

148148
interface TaggedPair<T> extends Pair<T> {
149-
>TaggedPair : Symbol(TaggedPair, Decl(genericTypeAliases.ts, 46, 27))
149+
>TaggedPair : Symbol(TaggedPair, Decl(genericTypeAliases.ts, 46, 24))
150150
>T : Symbol(T, Decl(genericTypeAliases.ts, 48, 21))
151151
>Pair : Symbol(Pair, Decl(genericTypeAliases.ts, 44, 1))
152152
>T : Symbol(T, Decl(genericTypeAliases.ts, 48, 21))
@@ -157,17 +157,17 @@ interface TaggedPair<T> extends Pair<T> {
157157

158158
var p: TaggedPair<number>;
159159
>p : Symbol(p, Decl(genericTypeAliases.ts, 52, 3))
160-
>TaggedPair : Symbol(TaggedPair, Decl(genericTypeAliases.ts, 46, 27))
160+
>TaggedPair : Symbol(TaggedPair, Decl(genericTypeAliases.ts, 46, 24))
161161

162162
p.a = 1;
163-
>p.a : Symbol(Tuple.a, Decl(genericTypeAliases.ts, 41, 23))
163+
>p.a : Symbol(AB.a, Decl(genericTypeAliases.ts, 41, 20))
164164
>p : Symbol(p, Decl(genericTypeAliases.ts, 52, 3))
165-
>a : Symbol(Tuple.a, Decl(genericTypeAliases.ts, 41, 23))
165+
>a : Symbol(AB.a, Decl(genericTypeAliases.ts, 41, 20))
166166

167167
p.b = 2;
168-
>p.b : Symbol(Tuple.b, Decl(genericTypeAliases.ts, 42, 9))
168+
>p.b : Symbol(AB.b, Decl(genericTypeAliases.ts, 42, 9))
169169
>p : Symbol(p, Decl(genericTypeAliases.ts, 52, 3))
170-
>b : Symbol(Tuple.b, Decl(genericTypeAliases.ts, 42, 9))
170+
>b : Symbol(AB.b, Decl(genericTypeAliases.ts, 42, 9))
171171

172172
p.tag = "test";
173173
>p.tag : Symbol(TaggedPair.tag, Decl(genericTypeAliases.ts, 48, 41))

tests/baselines/reference/genericTypeAliases.types

+6-6
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ s = "hello";
158158
>s : string
159159
>"hello" : "hello"
160160

161-
interface Tuple<A, B> {
162-
>Tuple : Tuple<A, B>
161+
interface AB<A, B> {
162+
>AB : AB<A, B>
163163
>A : A
164164
>B : B
165165

@@ -172,17 +172,17 @@ interface Tuple<A, B> {
172172
>B : B
173173
}
174174

175-
type Pair<T> = Tuple<T, T>;
176-
>Pair : Tuple<T, T>
175+
type Pair<T> = AB<T, T>;
176+
>Pair : AB<T, T>
177177
>T : T
178-
>Tuple : Tuple<A, B>
178+
>AB : AB<A, B>
179179
>T : T
180180
>T : T
181181

182182
interface TaggedPair<T> extends Pair<T> {
183183
>TaggedPair : TaggedPair<T>
184184
>T : T
185-
>Pair : Tuple<T, T>
185+
>Pair : AB<T, T>
186186
>T : T
187187

188188
tag: string;

tests/baselines/reference/nominalSubtypeCheckOfTypeParameter.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
//// [nominalSubtypeCheckOfTypeParameter.ts]
2-
interface Tuple<T, S> {
2+
interface BinaryTuple<T, S> {
33
first: T
4-
second: S
4+
second: S
55
}
66

77
interface Sequence<T> {
88
hasNext(): boolean
9-
pop(): T
10-
zip<S>(seq: Sequence<S>): Sequence<Tuple<T, S>>
9+
pop(): T
10+
zip<S>(seq: Sequence<S>): Sequence<BinaryTuple<T, S>>
1111
}
1212

1313
// error, despite the fact that the code explicitly says List<T> extends Sequence<T>, the current rules for infinitely expanding type references
1414
// perform nominal subtyping checks that allow variance for type arguments, but not nominal subtyping for the generic type itself
1515
interface List<T> extends Sequence<T> {
1616
getLength(): number
17-
zip<S>(seq: Sequence<S>): List<Tuple<T, S>>
17+
zip<S>(seq: Sequence<S>): List<BinaryTuple<T, S>>
1818
}
1919

2020

Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
=== tests/cases/conformance/types/typeRelationships/recursiveTypes/nominalSubtypeCheckOfTypeParameter.ts ===
2-
interface Tuple<T, S> {
3-
>Tuple : Symbol(Tuple, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 0))
4-
>T : Symbol(T, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 16))
5-
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 18))
2+
interface BinaryTuple<T, S> {
3+
>BinaryTuple : Symbol(BinaryTuple, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 0))
4+
>T : Symbol(T, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 22))
5+
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 24))
66

77
first: T
8-
>first : Symbol(Tuple.first, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 23))
9-
>T : Symbol(T, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 16))
8+
>first : Symbol(BinaryTuple.first, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 29))
9+
>T : Symbol(T, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 22))
1010

11-
second: S
12-
>second : Symbol(Tuple.second, Decl(nominalSubtypeCheckOfTypeParameter.ts, 1, 12))
13-
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 18))
11+
second: S
12+
>second : Symbol(BinaryTuple.second, Decl(nominalSubtypeCheckOfTypeParameter.ts, 1, 12))
13+
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 24))
1414
}
1515

1616
interface Sequence<T> {
@@ -20,20 +20,20 @@ interface Sequence<T> {
2020
hasNext(): boolean
2121
>hasNext : Symbol(Sequence.hasNext, Decl(nominalSubtypeCheckOfTypeParameter.ts, 5, 23))
2222

23-
pop(): T
23+
pop(): T
2424
>pop : Symbol(Sequence.pop, Decl(nominalSubtypeCheckOfTypeParameter.ts, 6, 22))
2525
>T : Symbol(T, Decl(nominalSubtypeCheckOfTypeParameter.ts, 5, 19))
2626

27-
zip<S>(seq: Sequence<S>): Sequence<Tuple<T, S>>
28-
>zip : Symbol(Sequence.zip, Decl(nominalSubtypeCheckOfTypeParameter.ts, 7, 14))
29-
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 8, 10))
30-
>seq : Symbol(seq, Decl(nominalSubtypeCheckOfTypeParameter.ts, 8, 13))
27+
zip<S>(seq: Sequence<S>): Sequence<BinaryTuple<T, S>>
28+
>zip : Symbol(Sequence.zip, Decl(nominalSubtypeCheckOfTypeParameter.ts, 7, 12))
29+
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 8, 8))
30+
>seq : Symbol(seq, Decl(nominalSubtypeCheckOfTypeParameter.ts, 8, 11))
3131
>Sequence : Symbol(Sequence, Decl(nominalSubtypeCheckOfTypeParameter.ts, 3, 1))
32-
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 8, 10))
32+
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 8, 8))
3333
>Sequence : Symbol(Sequence, Decl(nominalSubtypeCheckOfTypeParameter.ts, 3, 1))
34-
>Tuple : Symbol(Tuple, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 0))
34+
>BinaryTuple : Symbol(BinaryTuple, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 0))
3535
>T : Symbol(T, Decl(nominalSubtypeCheckOfTypeParameter.ts, 5, 19))
36-
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 8, 10))
36+
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 8, 8))
3737
}
3838

3939
// error, despite the fact that the code explicitly says List<T> extends Sequence<T>, the current rules for infinitely expanding type references
@@ -47,15 +47,15 @@ interface List<T> extends Sequence<T> {
4747
getLength(): number
4848
>getLength : Symbol(List.getLength, Decl(nominalSubtypeCheckOfTypeParameter.ts, 13, 39))
4949

50-
zip<S>(seq: Sequence<S>): List<Tuple<T, S>>
50+
zip<S>(seq: Sequence<S>): List<BinaryTuple<T, S>>
5151
>zip : Symbol(List.zip, Decl(nominalSubtypeCheckOfTypeParameter.ts, 14, 23))
52-
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 15, 10))
53-
>seq : Symbol(seq, Decl(nominalSubtypeCheckOfTypeParameter.ts, 15, 13))
52+
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 15, 8))
53+
>seq : Symbol(seq, Decl(nominalSubtypeCheckOfTypeParameter.ts, 15, 11))
5454
>Sequence : Symbol(Sequence, Decl(nominalSubtypeCheckOfTypeParameter.ts, 3, 1))
55-
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 15, 10))
55+
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 15, 8))
5656
>List : Symbol(List, Decl(nominalSubtypeCheckOfTypeParameter.ts, 9, 1))
57-
>Tuple : Symbol(Tuple, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 0))
57+
>BinaryTuple : Symbol(BinaryTuple, Decl(nominalSubtypeCheckOfTypeParameter.ts, 0, 0))
5858
>T : Symbol(T, Decl(nominalSubtypeCheckOfTypeParameter.ts, 13, 15))
59-
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 15, 10))
59+
>S : Symbol(S, Decl(nominalSubtypeCheckOfTypeParameter.ts, 15, 8))
6060
}
6161

tests/baselines/reference/nominalSubtypeCheckOfTypeParameter.types

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
=== tests/cases/conformance/types/typeRelationships/recursiveTypes/nominalSubtypeCheckOfTypeParameter.ts ===
2-
interface Tuple<T, S> {
3-
>Tuple : Tuple<T, S>
2+
interface BinaryTuple<T, S> {
3+
>BinaryTuple : BinaryTuple<T, S>
44
>T : T
55
>S : S
66

77
first: T
88
>first : T
99
>T : T
1010

11-
second: S
11+
second: S
1212
>second : S
1313
>S : S
1414
}
@@ -20,18 +20,18 @@ interface Sequence<T> {
2020
hasNext(): boolean
2121
>hasNext : () => boolean
2222

23-
pop(): T
23+
pop(): T
2424
>pop : () => T
2525
>T : T
2626

27-
zip<S>(seq: Sequence<S>): Sequence<Tuple<T, S>>
28-
>zip : <S>(seq: Sequence<S>) => Sequence<Tuple<T, S>>
27+
zip<S>(seq: Sequence<S>): Sequence<BinaryTuple<T, S>>
28+
>zip : <S>(seq: Sequence<S>) => Sequence<BinaryTuple<T, S>>
2929
>S : S
3030
>seq : Sequence<S>
3131
>Sequence : Sequence<T>
3232
>S : S
3333
>Sequence : Sequence<T>
34-
>Tuple : Tuple<T, S>
34+
>BinaryTuple : BinaryTuple<T, S>
3535
>T : T
3636
>S : S
3737
}
@@ -47,14 +47,14 @@ interface List<T> extends Sequence<T> {
4747
getLength(): number
4848
>getLength : () => number
4949

50-
zip<S>(seq: Sequence<S>): List<Tuple<T, S>>
51-
>zip : <S>(seq: Sequence<S>) => List<Tuple<T, S>>
50+
zip<S>(seq: Sequence<S>): List<BinaryTuple<T, S>>
51+
>zip : <S>(seq: Sequence<S>) => List<BinaryTuple<T, S>>
5252
>S : S
5353
>seq : Sequence<S>
5454
>Sequence : Sequence<T>
5555
>S : S
5656
>List : List<T>
57-
>Tuple : Tuple<T, S>
57+
>BinaryTuple : BinaryTuple<T, S>
5858
>T : T
5959
>S : S
6060
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
tests/cases/compiler/tupleLength.ts(1,9): error TS1122: A tuple type element list cannot be empty.
2+
tests/cases/compiler/tupleLength.ts(5,5): error TS2322: Type 'number' is not assignable to type '0'.
3+
tests/cases/compiler/tupleLength.ts(6,5): error TS2322: Type 'number' is not assignable to type '2'.
4+
tests/cases/compiler/tupleLength.ts(11,5): error TS2322: Type 'number' is not assignable to type '1'.
5+
6+
7+
==== tests/cases/compiler/tupleLength.ts (4 errors) ====
8+
var t0: [];
9+
~~
10+
!!! error TS1122: A tuple type element list cannot be empty.
11+
var t2: [number, string];
12+
var arr: number[];
13+
14+
var len0: 0 = t0.length;
15+
~~~~
16+
!!! error TS2322: Type 'number' is not assignable to type '0'.
17+
var len2: 2 = t2.length;
18+
~~~~
19+
!!! error TS2322: Type 'number' is not assignable to type '2'.
20+
var lena: number = arr.length;
21+
22+
type A<T extends any[]> = T['length'];
23+
var b: A<[boolean]>;
24+
var c: 1 = b;
25+
~
26+
!!! error TS2322: Type 'number' is not assignable to type '1'.
27+
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [tupleLength.ts]
2+
var t0: [];
3+
var t2: [number, string];
4+
var arr: number[];
5+
6+
var len0: 0 = t0.length;
7+
var len2: 2 = t2.length;
8+
var lena: number = arr.length;
9+
10+
type A<T extends any[]> = T['length'];
11+
var b: A<[boolean]>;
12+
var c: 1 = b;
13+
14+
15+
//// [tupleLength.js]
16+
var t0;
17+
var t2;
18+
var arr;
19+
var len0 = t0.length;
20+
var len2 = t2.length;
21+
var lena = arr.length;
22+
var b;
23+
var c = b;

tests/cases/compiler/tupleLength.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
var t0: [];
2+
var t2: [number, string];
3+
var arr: number[];
4+
5+
var len0: 0 = t0.length;
6+
var len2: 2 = t2.length;
7+
var lena: number = arr.length;
8+
9+
type A<T extends any[]> = T['length'];
10+
var b: A<[boolean]>;
11+
var c: 1 = b;

tests/cases/conformance/types/typeAliases/genericTypeAliases.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ type Strange<T> = string; // Type parameter not used
3939
var s: Strange<number>;
4040
s = "hello";
4141

42-
interface Tuple<A, B> {
42+
interface AB<A, B> {
4343
a: A;
4444
b: B;
4545
}
4646

47-
type Pair<T> = Tuple<T, T>;
47+
type Pair<T> = AB<T, T>;
4848

4949
interface TaggedPair<T> extends Pair<T> {
5050
tag: string;

0 commit comments

Comments
 (0)