Skip to content

Commit d869e56

Browse files
committed
Add tests
1 parent d7443f0 commit d869e56

File tree

3 files changed

+156
-18
lines changed

3 files changed

+156
-18
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// @strict: true
2+
// @declaration: true
3+
4+
declare const t1: [number, string, ...boolean[]];
5+
declare const t2: [string, ...boolean[]];
6+
declare const t3: [...boolean[]];
7+
declare const t4: [];
8+
9+
declare let f00: (...x: [number, string, boolean]) => void;
10+
declare let f01: (a: number, ...x: [string, boolean]) => void;
11+
declare let f02: (a: number, b: string, ...x: [boolean]) => void;
12+
declare let f03: (a: number, b: string, c: boolean) => void;
13+
declare let f04: (a: number, b: string, c: boolean, ...x: []) => void;
14+
15+
declare let f10: (...x: [number, string, ...boolean[]]) => void;
16+
declare let f11: (a: number, ...x: [string, ...boolean[]]) => void;
17+
declare let f12: (a: number, b: string, ...x: [...boolean[]]) => void;
18+
declare let f13: (a: number, b: string, ...c: boolean[]) => void;
19+
20+
declare const ns: [number, string];
21+
declare const sn: [string, number];
22+
23+
f10(42, "hello");
24+
f10(42, "hello", true);
25+
f10(42, "hello", true, false);
26+
f10(t1[0], t1[1], t1[2], t1[3]);
27+
f10(...t1);
28+
f10(42, ...t2);
29+
f10(42, "hello", ...t3);
30+
f10(42, "hello", true, ...t4);
31+
f10(42, "hello", true, ...t4, false, ...t3);
32+
33+
f11(42, "hello");
34+
f11(42, "hello", true);
35+
f11(42, "hello", true, false);
36+
f11(t1[0], t1[1], t1[2], t1[3]);
37+
f11(...t1);
38+
f11(42, ...t2);
39+
f11(42, "hello", ...t3);
40+
f11(42, "hello", true, ...t4);
41+
f11(42, "hello", true, ...t4, false, ...t3);
42+
43+
f12(42, "hello");
44+
f12(42, "hello", true);
45+
f12(42, "hello", true, false);
46+
f12(t1[0], t1[1], t1[2], t1[3]);
47+
f12(...t1);
48+
f12(42, ...t2);
49+
f12(42, "hello", ...t3);
50+
f12(42, "hello", true, ...t4);
51+
f12(42, "hello", true, ...t4, false, ...t3);
52+
53+
f13(42, "hello");
54+
f13(42, "hello", true);
55+
f13(42, "hello", true, false);
56+
f13(t1[0], t1[1], t1[2], t1[3]);
57+
f13(...t1);
58+
f13(42, ...t2);
59+
f13(42, "hello", ...t3);
60+
f13(42, "hello", true, ...t4);
61+
f13(42, "hello", true, ...t4, false, ...t3);
62+
63+
declare const f20: <T extends unknown[]>(...args: T) => T;
64+
65+
f20(...t1);
66+
f20(42, ...t2);
67+
f20(42, "hello", ...t3);
68+
f20(42, "hello", ...t2, true);
69+
70+
type Parameters<T extends Function> = T extends ((...args: infer U) => any) | (new(...args: infer U) => any) ? U : any[];
71+
72+
type T01 = Parameters<(x: number, y: string, ...z: boolean[]) => void>;
73+
type T02 = Parameters<(...args: [number, string, ...boolean[]]) => void>;
74+
type T03 = Parameters<new (x: number, y: string, ...z: boolean[]) => void>;
75+
type T04 = Parameters<new (...args: [number, string, ...boolean[]]) => void>;
76+
type T05<T extends any[]> = Parameters<(x: string, ...args: T) => void>;
77+
type T06 = T05<[number, ...boolean[]]>;
78+
79+
type P1<T extends Function> = T extends (head: infer A, ...tail: infer B) => any ? { head: A, tail: B } : any[];
80+
81+
type T10 = P1<(x: number, y: string, ...z: boolean[]) => void>;
82+
type T11 = P1<(...z: number[]) => void>;
83+
type T12 = P1<(x: number, y: number) => void>;

tests/cases/conformance/types/tuple/optionalTupleElements1.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ type L2 = T2["length"];
1111
type L3 = T3["length"];
1212
type L4 = T4["length"];
1313

14+
type T5 = [number, string?, boolean]; // Error
15+
1416
function f1(t1: T1, t2: T2, t3: T3, t4: T4) {
1517
t1 = t1;
1618
t1 = t2; // Error
@@ -30,26 +32,9 @@ function f1(t1: T1, t2: T2, t3: T3, t4: T4) {
3032
t4 = t4;
3133
}
3234

33-
type T5 = [number, string?, boolean];
34-
type L5 = T5["length"];
35-
36-
function f2(t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) {
37-
t1 = t5; // Error
38-
t2 = t5; // Error
39-
t3 = t5;
40-
t4 = t5;
41-
t5 = t5;
42-
t5 = t1;
43-
t5 = t2; // Error
44-
t5 = t3; // Error
45-
t5 = t4; // Error
46-
t5 = t5;
47-
}
48-
4935
let t2: T2;
5036
let t3: T3;
5137
let t4: T4;
52-
let t5: T5;
5338

5439
t2 = [42, "hello"];
5540
t3 = [42, "hello"];
@@ -60,4 +45,3 @@ t4 = [42,,true];
6045
t4 = [,"hello", true];
6146
t4 = [,,true];
6247
t4 = [];
63-
t5 = [42,,true];
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// @strict: true
2+
// @declaration: true
3+
4+
type T00 = [string?];
5+
type T01 = [string, string?];
6+
type T02 = [string?, string]; // Error
7+
type T03 = [...string[]];
8+
type T04 = [...[...string[]]];
9+
type T05 = [...[...[...string[]]]];
10+
type T06 = [string, ...string[]];
11+
type T07 = [...string[], string]; // Error
12+
type T08 = [...string]; // Error
13+
type T09 = [...string?]; // Error
14+
type T10 = [string, ...[...string[]]];
15+
type T11 = [string, ...[...[...string[]]]];
16+
17+
type T15 = [boolean, number, ...string[]];
18+
type L15 = T15["length"]; // number
19+
20+
declare function assign<T, S extends T>(): void;
21+
22+
assign<number[], [...number[]]>();
23+
assign<number[], [number, ...number[]]>();
24+
assign<[...number[]], number[]>();
25+
26+
assign<[number, ...number[]], number[]>(); // Error
27+
assign<[number, ...number[]], []>(); // Error
28+
assign<[number, ...number[]], [number]>();
29+
assign<[number, ...number[]], [number, number]>();
30+
assign<[number, ...number[]], [number, number, ...number[]]>();
31+
32+
assign<[number], [...number[]]>(); // Error
33+
assign<[number], [number, ...number[]]>(); // Error
34+
35+
assign<[number, ...number[]], [number, ...string[]]>(); // Error
36+
assign<[number, ...number[]], [string, ...number[]]>(); // Error
37+
assign<[number, ...number[]], [number, number, string]>(); // Error
38+
assign<[number, ...number[]], [number, number, number, string]>(); // Error
39+
40+
type T20 = [number, string, ...boolean[]];
41+
42+
type T21 = T20[0];
43+
type T22 = T20[0 | 1];
44+
type T23 = T20[0 | 1 | 2];
45+
type T24 = T20[0 | 1 | 2 | 3];
46+
type T25 = T20[1 | 2 | 3];
47+
type T26 = T20[2 | 3];
48+
type T27 = T20[3];
49+
type T28 = T20[number];
50+
51+
declare const t: T20;
52+
declare const x: number;
53+
54+
let e0 = t[0]; // number
55+
let e1 = t[1]; // string
56+
let e2 = t[2]; // boolean
57+
let e3 = t[3]; // boolean
58+
let ex = t[x]; // number | string | boolean
59+
60+
declare function f0<T, U>(x: [T, ...U[]]): [T, U];
61+
62+
f0([]); // Error
63+
f0([1]);
64+
f0([1, 2, 3]);
65+
f0([1, "hello", true]);
66+
67+
declare function f1(a: [(x: number) => number, ...((x: string) => number)[]]): void;
68+
declare function f2(...a: [(x: number) => number, ...((x: string) => number)[]]): void;
69+
70+
f1([x => x * 2, x => x.length, x => x.charCodeAt(0)]);
71+
f2(x => x * 2, x => x.length, x => x.charCodeAt(0));

0 commit comments

Comments
 (0)