Skip to content

Commit 85fd141

Browse files
author
Yui
committed
Merge pull request #822 from Microsoft/tupleConformance
Tuple conformance
2 parents 432fff1 + 0ef3cd1 commit 85fd141

24 files changed

+1137
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatBetweenTupleAndArray.ts(17,1): error TS2322: Type '[number, string]' is not assignable to type 'number[]':
2+
Types of property 'pop' are incompatible:
3+
Type '() => {}' is not assignable to type '() => number':
4+
Type '{}' is not assignable to type 'number'.
5+
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatBetweenTupleAndArray.ts(18,1): error TS2322: Type '{}[]' is not assignable to type '[{}]':
6+
Property '0' is missing in type '{}[]'.
7+
8+
9+
==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatBetweenTupleAndArray.ts (2 errors) ====
10+
var numStrTuple: [number, string];
11+
var numNumTuple: [number, number];
12+
var numEmptyObjTuple: [number, {}];
13+
var emptyObjTuple: [{}];
14+
15+
var numArray: number[];
16+
var emptyObjArray: {}[];
17+
18+
// no error
19+
numArray = numNumTuple;
20+
emptyObjArray = emptyObjTuple;
21+
emptyObjArray = numStrTuple;
22+
emptyObjArray = numNumTuple;
23+
emptyObjArray = numEmptyObjTuple;
24+
25+
// error
26+
numArray = numStrTuple;
27+
~~~~~~~~
28+
!!! error TS2322: Type '[number, string]' is not assignable to type 'number[]':
29+
!!! error TS2322: Types of property 'pop' are incompatible:
30+
!!! error TS2322: Type '() => {}' is not assignable to type '() => number':
31+
!!! error TS2322: Type '{}' is not assignable to type 'number'.
32+
emptyObjTuple = emptyObjArray;
33+
~~~~~~~~~~~~~
34+
!!! error TS2322: Type '{}[]' is not assignable to type '[{}]':
35+
!!! error TS2322: Property '0' is missing in type '{}[]'.
36+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//// [assignmentCompatBetweenTupleAndArray.ts]
2+
var numStrTuple: [number, string];
3+
var numNumTuple: [number, number];
4+
var numEmptyObjTuple: [number, {}];
5+
var emptyObjTuple: [{}];
6+
7+
var numArray: number[];
8+
var emptyObjArray: {}[];
9+
10+
// no error
11+
numArray = numNumTuple;
12+
emptyObjArray = emptyObjTuple;
13+
emptyObjArray = numStrTuple;
14+
emptyObjArray = numNumTuple;
15+
emptyObjArray = numEmptyObjTuple;
16+
17+
// error
18+
numArray = numStrTuple;
19+
emptyObjTuple = emptyObjArray;
20+
21+
22+
//// [assignmentCompatBetweenTupleAndArray.js]
23+
var numStrTuple;
24+
var numNumTuple;
25+
var numEmptyObjTuple;
26+
var emptyObjTuple;
27+
var numArray;
28+
var emptyObjArray;
29+
// no error
30+
numArray = numNumTuple;
31+
emptyObjArray = emptyObjTuple;
32+
emptyObjArray = numStrTuple;
33+
emptyObjArray = numNumTuple;
34+
emptyObjArray = numEmptyObjTuple;
35+
// error
36+
numArray = numStrTuple;
37+
emptyObjTuple = emptyObjArray;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
//// [bestCommonTypeOfTuple.ts]
2+
function f1(x: number): string { return "foo"; }
3+
4+
function f2(x: number): number { return 10; }
5+
6+
function f3(x: number): boolean { return true; }
7+
8+
enum E1 { one }
9+
10+
enum E2 { two }
11+
12+
13+
var t1: [(x: number) => string, (x: number) => number];
14+
var t2: [E1, E2];
15+
var t3: [number, any];
16+
var t4: [E1, E2, number];
17+
18+
// no error
19+
t1 = [f1, f2];
20+
t2 = [E1.one, E2.two];
21+
t3 = [5, undefined];
22+
t4 = [E1.one, E2.two, 20];
23+
var e1 = t1[2]; // {}
24+
var e2 = t2[2]; // {}
25+
var e3 = t3[2]; // any
26+
var e4 = t4[3]; // number
27+
28+
//// [bestCommonTypeOfTuple.js]
29+
function f1(x) {
30+
return "foo";
31+
}
32+
function f2(x) {
33+
return 10;
34+
}
35+
function f3(x) {
36+
return true;
37+
}
38+
var E1;
39+
(function (E1) {
40+
E1[E1["one"] = 0] = "one";
41+
})(E1 || (E1 = {}));
42+
var E2;
43+
(function (E2) {
44+
E2[E2["two"] = 0] = "two";
45+
})(E2 || (E2 = {}));
46+
var t1;
47+
var t2;
48+
var t3;
49+
var t4;
50+
// no error
51+
t1 = [f1, f2];
52+
t2 = [0 /* one */, 0 /* two */];
53+
t3 = [5, undefined];
54+
t4 = [0 /* one */, 0 /* two */, 20];
55+
var e1 = t1[2]; // {}
56+
var e2 = t2[2]; // {}
57+
var e3 = t3[2]; // any
58+
var e4 = t4[3]; // number
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
=== tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfTuple.ts ===
2+
function f1(x: number): string { return "foo"; }
3+
>f1 : (x: number) => string
4+
>x : number
5+
6+
function f2(x: number): number { return 10; }
7+
>f2 : (x: number) => number
8+
>x : number
9+
10+
function f3(x: number): boolean { return true; }
11+
>f3 : (x: number) => boolean
12+
>x : number
13+
14+
enum E1 { one }
15+
>E1 : E1
16+
>one : E1
17+
18+
enum E2 { two }
19+
>E2 : E2
20+
>two : E2
21+
22+
23+
var t1: [(x: number) => string, (x: number) => number];
24+
>t1 : [(x: number) => string, (x: number) => number]
25+
>x : number
26+
>x : number
27+
28+
var t2: [E1, E2];
29+
>t2 : [E1, E2]
30+
>E1 : E1
31+
>E2 : E2
32+
33+
var t3: [number, any];
34+
>t3 : [number, any]
35+
36+
var t4: [E1, E2, number];
37+
>t4 : [E1, E2, number]
38+
>E1 : E1
39+
>E2 : E2
40+
41+
// no error
42+
t1 = [f1, f2];
43+
>t1 = [f1, f2] : [(x: number) => string, (x: number) => number]
44+
>t1 : [(x: number) => string, (x: number) => number]
45+
>[f1, f2] : [(x: number) => string, (x: number) => number]
46+
>f1 : (x: number) => string
47+
>f2 : (x: number) => number
48+
49+
t2 = [E1.one, E2.two];
50+
>t2 = [E1.one, E2.two] : [E1, E2]
51+
>t2 : [E1, E2]
52+
>[E1.one, E2.two] : [E1, E2]
53+
>E1.one : E1
54+
>E1 : typeof E1
55+
>one : E1
56+
>E2.two : E2
57+
>E2 : typeof E2
58+
>two : E2
59+
60+
t3 = [5, undefined];
61+
>t3 = [5, undefined] : [number, undefined]
62+
>t3 : [number, any]
63+
>[5, undefined] : [number, undefined]
64+
>undefined : undefined
65+
66+
t4 = [E1.one, E2.two, 20];
67+
>t4 = [E1.one, E2.two, 20] : [E1, E2, number]
68+
>t4 : [E1, E2, number]
69+
>[E1.one, E2.two, 20] : [E1, E2, number]
70+
>E1.one : E1
71+
>E1 : typeof E1
72+
>one : E1
73+
>E2.two : E2
74+
>E2 : typeof E2
75+
>two : E2
76+
77+
var e1 = t1[2]; // {}
78+
>e1 : {}
79+
>t1[2] : {}
80+
>t1 : [(x: number) => string, (x: number) => number]
81+
82+
var e2 = t2[2]; // {}
83+
>e2 : {}
84+
>t2[2] : {}
85+
>t2 : [E1, E2]
86+
87+
var e3 = t3[2]; // any
88+
>e3 : any
89+
>t3[2] : any
90+
>t3 : [number, any]
91+
92+
var e4 = t4[3]; // number
93+
>e4 : number
94+
>t4[3] : number
95+
>t4 : [E1, E2, number]
96+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//// [bestCommonTypeOfTuple2.ts]
2+
interface base { }
3+
interface base1 { i }
4+
class C implements base { c }
5+
class D implements base { d }
6+
class E implements base { e }
7+
class F extends C { f }
8+
9+
class C1 implements base1 { i = "foo"; c }
10+
class D1 extends C1 { i = "bar"; d }
11+
12+
var t1: [C, base];
13+
var t2: [C, D];
14+
var t3: [C1, D1];
15+
var t4: [base1, C1];
16+
var t5: [C1, F]
17+
18+
var e11 = t1[4]; // base
19+
var e21 = t2[4]; // {}
20+
var e31 = t3[4]; // C1
21+
var e41 = t4[2]; // base1
22+
var e51 = t5[2]; // {}
23+
24+
25+
//// [bestCommonTypeOfTuple2.js]
26+
var __extends = this.__extends || function (d, b) {
27+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
28+
function __() { this.constructor = d; }
29+
__.prototype = b.prototype;
30+
d.prototype = new __();
31+
};
32+
var C = (function () {
33+
function C() {
34+
}
35+
return C;
36+
})();
37+
var D = (function () {
38+
function D() {
39+
}
40+
return D;
41+
})();
42+
var E = (function () {
43+
function E() {
44+
}
45+
return E;
46+
})();
47+
var F = (function (_super) {
48+
__extends(F, _super);
49+
function F() {
50+
_super.apply(this, arguments);
51+
}
52+
return F;
53+
})(C);
54+
var C1 = (function () {
55+
function C1() {
56+
this.i = "foo";
57+
}
58+
return C1;
59+
})();
60+
var D1 = (function (_super) {
61+
__extends(D1, _super);
62+
function D1() {
63+
_super.apply(this, arguments);
64+
this.i = "bar";
65+
}
66+
return D1;
67+
})(C1);
68+
var t1;
69+
var t2;
70+
var t3;
71+
var t4;
72+
var t5;
73+
var e11 = t1[4]; // base
74+
var e21 = t2[4]; // {}
75+
var e31 = t3[4]; // C1
76+
var e41 = t4[2]; // base1
77+
var e51 = t5[2]; // {}

0 commit comments

Comments
 (0)