Skip to content

Commit be36e76

Browse files
committed
Add tests
1 parent d369700 commit be36e76

File tree

3 files changed

+286
-0
lines changed

3 files changed

+286
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
//// [tests/cases/conformance/types/mapped/mappedTypesGenericTuples.ts] ////
2+
3+
=== mappedTypesGenericTuples.ts ===
4+
// Property keys are `number` following the fixed part of a tuple
5+
6+
type K<T> = { [P in keyof T]: P };
7+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
8+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 2, 7))
9+
>P : Symbol(P, Decl(mappedTypesGenericTuples.ts, 2, 15))
10+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 2, 7))
11+
>P : Symbol(P, Decl(mappedTypesGenericTuples.ts, 2, 15))
12+
13+
type M<T> = { [P in keyof T]: T[P] };
14+
>M : Symbol(M, Decl(mappedTypesGenericTuples.ts, 2, 34))
15+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 3, 7))
16+
>P : Symbol(P, Decl(mappedTypesGenericTuples.ts, 3, 15))
17+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 3, 7))
18+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 3, 7))
19+
>P : Symbol(P, Decl(mappedTypesGenericTuples.ts, 3, 15))
20+
21+
type KA = K<[string, string, boolean]>; // ["0", "1", "2"]
22+
>KA : Symbol(KA, Decl(mappedTypesGenericTuples.ts, 3, 37))
23+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
24+
25+
type KB = K<[string, string, ...string[], string]>; // ["0", "1", ...number[], number]
26+
>KB : Symbol(KB, Decl(mappedTypesGenericTuples.ts, 5, 39))
27+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
28+
29+
type KC = K<[...string[]]>; // number[]
30+
>KC : Symbol(KC, Decl(mappedTypesGenericTuples.ts, 6, 51))
31+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
32+
33+
type KD = K<string[]>; // number[]
34+
>KD : Symbol(KD, Decl(mappedTypesGenericTuples.ts, 7, 27))
35+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
36+
37+
type A = { a: string };
38+
>A : Symbol(A, Decl(mappedTypesGenericTuples.ts, 8, 22))
39+
>a : Symbol(a, Decl(mappedTypesGenericTuples.ts, 10, 10))
40+
41+
type B = { b: string };
42+
>B : Symbol(B, Decl(mappedTypesGenericTuples.ts, 10, 23))
43+
>b : Symbol(b, Decl(mappedTypesGenericTuples.ts, 11, 10))
44+
45+
type C = { c: string };
46+
>C : Symbol(C, Decl(mappedTypesGenericTuples.ts, 11, 23))
47+
>c : Symbol(c, Decl(mappedTypesGenericTuples.ts, 12, 10))
48+
49+
type D = { d: string };
50+
>D : Symbol(D, Decl(mappedTypesGenericTuples.ts, 12, 23))
51+
>d : Symbol(d, Decl(mappedTypesGenericTuples.ts, 13, 10))
52+
53+
type V0<T extends unknown[]> = [A, B?, ...T, ...C[]]
54+
>V0 : Symbol(V0, Decl(mappedTypesGenericTuples.ts, 13, 23))
55+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 15, 8))
56+
>A : Symbol(A, Decl(mappedTypesGenericTuples.ts, 8, 22))
57+
>B : Symbol(B, Decl(mappedTypesGenericTuples.ts, 10, 23))
58+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 15, 8))
59+
>C : Symbol(C, Decl(mappedTypesGenericTuples.ts, 11, 23))
60+
61+
type V1<T extends unknown[]> = [A, ...T, B, ...C[], D]
62+
>V1 : Symbol(V1, Decl(mappedTypesGenericTuples.ts, 15, 52))
63+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 16, 8))
64+
>A : Symbol(A, Decl(mappedTypesGenericTuples.ts, 8, 22))
65+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 16, 8))
66+
>B : Symbol(B, Decl(mappedTypesGenericTuples.ts, 10, 23))
67+
>C : Symbol(C, Decl(mappedTypesGenericTuples.ts, 11, 23))
68+
>D : Symbol(D, Decl(mappedTypesGenericTuples.ts, 12, 23))
69+
70+
type K0<T extends unknown[]> = K<V0<T>>; // ["0", "1"?, ...K<T>, ...number[]]
71+
>K0 : Symbol(K0, Decl(mappedTypesGenericTuples.ts, 16, 54))
72+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 18, 8))
73+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
74+
>V0 : Symbol(V0, Decl(mappedTypesGenericTuples.ts, 13, 23))
75+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 18, 8))
76+
77+
type K1<T extends unknown[]> = K<V1<T>>; // ["0", ...K<T>, number, ...number[], number]
78+
>K1 : Symbol(K1, Decl(mappedTypesGenericTuples.ts, 18, 40))
79+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 19, 8))
80+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
81+
>V1 : Symbol(V1, Decl(mappedTypesGenericTuples.ts, 15, 52))
82+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 19, 8))
83+
84+
type M0<T extends unknown[]> = M<V0<T>>; // [A, B?, ...M<T>, ...C[]]
85+
>M0 : Symbol(M0, Decl(mappedTypesGenericTuples.ts, 19, 40))
86+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 21, 8))
87+
>M : Symbol(M, Decl(mappedTypesGenericTuples.ts, 2, 34))
88+
>V0 : Symbol(V0, Decl(mappedTypesGenericTuples.ts, 13, 23))
89+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 21, 8))
90+
91+
type M1<T extends unknown[]> = M<V1<T>>; // [A, ...M<T>, B, ...C[], D]
92+
>M1 : Symbol(M1, Decl(mappedTypesGenericTuples.ts, 21, 40))
93+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 22, 8))
94+
>M : Symbol(M, Decl(mappedTypesGenericTuples.ts, 2, 34))
95+
>V1 : Symbol(V1, Decl(mappedTypesGenericTuples.ts, 15, 52))
96+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 22, 8))
97+
98+
// Repro from #48856
99+
100+
type Keys<O extends unknown[]> = { [K in keyof O]: K };
101+
>Keys : Symbol(Keys, Decl(mappedTypesGenericTuples.ts, 22, 40))
102+
>O : Symbol(O, Decl(mappedTypesGenericTuples.ts, 26, 10))
103+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 26, 36))
104+
>O : Symbol(O, Decl(mappedTypesGenericTuples.ts, 26, 10))
105+
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 26, 36))
106+
107+
type Keys1 = Keys<[string, ...string[]]>;
108+
>Keys1 : Symbol(Keys1, Decl(mappedTypesGenericTuples.ts, 26, 55))
109+
>Keys : Symbol(Keys, Decl(mappedTypesGenericTuples.ts, 22, 40))
110+
111+
type Keys2 = Keys<[string, ...string[], number]>;
112+
>Keys2 : Symbol(Keys2, Decl(mappedTypesGenericTuples.ts, 28, 41))
113+
>Keys : Symbol(Keys, Decl(mappedTypesGenericTuples.ts, 22, 40))
114+
115+
// Repro from #56888
116+
117+
type T1 = ['a', 'b', 'c'] extends readonly [infer H, ...unknown[]] ? H : never; // "a"
118+
>T1 : Symbol(T1, Decl(mappedTypesGenericTuples.ts, 29, 49))
119+
>H : Symbol(H, Decl(mappedTypesGenericTuples.ts, 33, 49))
120+
>H : Symbol(H, Decl(mappedTypesGenericTuples.ts, 33, 49))
121+
122+
type T2 = ['a', 'b', 'c'] extends Readonly<[infer H, ...unknown[]]> ? H : never; // "a"
123+
>T2 : Symbol(T2, Decl(mappedTypesGenericTuples.ts, 33, 79))
124+
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
125+
>H : Symbol(H, Decl(mappedTypesGenericTuples.ts, 34, 49))
126+
>H : Symbol(H, Decl(mappedTypesGenericTuples.ts, 34, 49))
127+
128+
type T3 = ['a', 'b', 'c'] extends readonly [...unknown[], infer L] ? L : never; // "c"
129+
>T3 : Symbol(T3, Decl(mappedTypesGenericTuples.ts, 34, 80))
130+
>L : Symbol(L, Decl(mappedTypesGenericTuples.ts, 35, 63))
131+
>L : Symbol(L, Decl(mappedTypesGenericTuples.ts, 35, 63))
132+
133+
type T4 = ['a', 'b', 'c'] extends Readonly<[...unknown[], infer L]> ? L : never; // "c"
134+
>T4 : Symbol(T4, Decl(mappedTypesGenericTuples.ts, 35, 79))
135+
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
136+
>L : Symbol(L, Decl(mappedTypesGenericTuples.ts, 36, 63))
137+
>L : Symbol(L, Decl(mappedTypesGenericTuples.ts, 36, 63))
138+
139+
// Repro from #56888
140+
141+
type R1<T> = readonly [...unknown[], T]; // readonly [...unknown[], T]
142+
>R1 : Symbol(R1, Decl(mappedTypesGenericTuples.ts, 36, 80))
143+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 40, 8))
144+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 40, 8))
145+
146+
type R2<T> = Readonly<[...unknown[], T]>; // readonly [...unknown[], T]
147+
>R2 : Symbol(R2, Decl(mappedTypesGenericTuples.ts, 40, 40))
148+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 41, 8))
149+
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
150+
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 41, 8))
151+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//// [tests/cases/conformance/types/mapped/mappedTypesGenericTuples.ts] ////
2+
3+
=== mappedTypesGenericTuples.ts ===
4+
// Property keys are `number` following the fixed part of a tuple
5+
6+
type K<T> = { [P in keyof T]: P };
7+
>K : K<T>
8+
9+
type M<T> = { [P in keyof T]: T[P] };
10+
>M : M<T>
11+
12+
type KA = K<[string, string, boolean]>; // ["0", "1", "2"]
13+
>KA : ["0", "1", "2"]
14+
15+
type KB = K<[string, string, ...string[], string]>; // ["0", "1", ...number[], number]
16+
>KB : ["0", "1", ...number[], number]
17+
18+
type KC = K<[...string[]]>; // number[]
19+
>KC : number[]
20+
21+
type KD = K<string[]>; // number[]
22+
>KD : number[]
23+
24+
type A = { a: string };
25+
>A : { a: string; }
26+
>a : string
27+
28+
type B = { b: string };
29+
>B : { b: string; }
30+
>b : string
31+
32+
type C = { c: string };
33+
>C : { c: string; }
34+
>c : string
35+
36+
type D = { d: string };
37+
>D : { d: string; }
38+
>d : string
39+
40+
type V0<T extends unknown[]> = [A, B?, ...T, ...C[]]
41+
>V0 : [A, (B | undefined)?, ...T, ...C[]]
42+
43+
type V1<T extends unknown[]> = [A, ...T, B, ...C[], D]
44+
>V1 : [A, ...T, B, ...C[], D]
45+
46+
type K0<T extends unknown[]> = K<V0<T>>; // ["0", "1"?, ...K<T>, ...number[]]
47+
>K0 : ["0", ("1" | undefined)?, ...K<T>, ...number[]]
48+
49+
type K1<T extends unknown[]> = K<V1<T>>; // ["0", ...K<T>, number, ...number[], number]
50+
>K1 : ["0", ...K<T>, number, ...number[], number]
51+
52+
type M0<T extends unknown[]> = M<V0<T>>; // [A, B?, ...M<T>, ...C[]]
53+
>M0 : [A, (B | undefined)?, ...M<T>, ...C[]]
54+
55+
type M1<T extends unknown[]> = M<V1<T>>; // [A, ...M<T>, B, ...C[], D]
56+
>M1 : [A, ...M<T>, B, ...C[], D]
57+
58+
// Repro from #48856
59+
60+
type Keys<O extends unknown[]> = { [K in keyof O]: K };
61+
>Keys : Keys<O>
62+
63+
type Keys1 = Keys<[string, ...string[]]>;
64+
>Keys1 : ["0", ...number[]]
65+
66+
type Keys2 = Keys<[string, ...string[], number]>;
67+
>Keys2 : ["0", ...number[], number]
68+
69+
// Repro from #56888
70+
71+
type T1 = ['a', 'b', 'c'] extends readonly [infer H, ...unknown[]] ? H : never; // "a"
72+
>T1 : "a"
73+
74+
type T2 = ['a', 'b', 'c'] extends Readonly<[infer H, ...unknown[]]> ? H : never; // "a"
75+
>T2 : "a"
76+
77+
type T3 = ['a', 'b', 'c'] extends readonly [...unknown[], infer L] ? L : never; // "c"
78+
>T3 : "c"
79+
80+
type T4 = ['a', 'b', 'c'] extends Readonly<[...unknown[], infer L]> ? L : never; // "c"
81+
>T4 : "c"
82+
83+
// Repro from #56888
84+
85+
type R1<T> = readonly [...unknown[], T]; // readonly [...unknown[], T]
86+
>R1 : R1<T>
87+
88+
type R2<T> = Readonly<[...unknown[], T]>; // readonly [...unknown[], T]
89+
>R2 : readonly [...unknown[], T]
90+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// Property keys are `number` following the fixed part of a tuple
5+
6+
type K<T> = { [P in keyof T]: P };
7+
type M<T> = { [P in keyof T]: T[P] };
8+
9+
type KA = K<[string, string, boolean]>; // ["0", "1", "2"]
10+
type KB = K<[string, string, ...string[], string]>; // ["0", "1", ...number[], number]
11+
type KC = K<[...string[]]>; // number[]
12+
type KD = K<string[]>; // number[]
13+
14+
type A = { a: string };
15+
type B = { b: string };
16+
type C = { c: string };
17+
type D = { d: string };
18+
19+
type V0<T extends unknown[]> = [A, B?, ...T, ...C[]]
20+
type V1<T extends unknown[]> = [A, ...T, B, ...C[], D]
21+
22+
type K0<T extends unknown[]> = K<V0<T>>; // ["0", "1"?, ...K<T>, ...number[]]
23+
type K1<T extends unknown[]> = K<V1<T>>; // ["0", ...K<T>, number, ...number[], number]
24+
25+
type M0<T extends unknown[]> = M<V0<T>>; // [A, B?, ...M<T>, ...C[]]
26+
type M1<T extends unknown[]> = M<V1<T>>; // [A, ...M<T>, B, ...C[], D]
27+
28+
// Repro from #48856
29+
30+
type Keys<O extends unknown[]> = { [K in keyof O]: K };
31+
32+
type Keys1 = Keys<[string, ...string[]]>;
33+
type Keys2 = Keys<[string, ...string[], number]>;
34+
35+
// Repro from #56888
36+
37+
type T1 = ['a', 'b', 'c'] extends readonly [infer H, ...unknown[]] ? H : never; // "a"
38+
type T2 = ['a', 'b', 'c'] extends Readonly<[infer H, ...unknown[]]> ? H : never; // "a"
39+
type T3 = ['a', 'b', 'c'] extends readonly [...unknown[], infer L] ? L : never; // "c"
40+
type T4 = ['a', 'b', 'c'] extends Readonly<[...unknown[], infer L]> ? L : never; // "c"
41+
42+
// Repro from #56888
43+
44+
type R1<T> = readonly [...unknown[], T]; // readonly [...unknown[], T]
45+
type R2<T> = Readonly<[...unknown[], T]>; // readonly [...unknown[], T]

0 commit comments

Comments
 (0)