Skip to content

Commit 12b63d2

Browse files
committed
Add regression test
1 parent a26a303 commit 12b63d2

File tree

4 files changed

+376
-0
lines changed

4 files changed

+376
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//// [keyofAndForIn.ts]
2+
3+
// Repro from #12513
4+
5+
function f1<K extends string, T>(obj: { [P in K]: T }, k: K) {
6+
const b = k in obj;
7+
let k1: K;
8+
for (k1 in obj) {
9+
let x1 = obj[k1];
10+
}
11+
for (let k2 in obj) {
12+
let x2 = obj[k2];
13+
}
14+
}
15+
16+
function f2<T>(obj: { [P in keyof T]: T[P] }, k: keyof T) {
17+
const b = k in obj;
18+
let k1: keyof T;
19+
for (k1 in obj) {
20+
let x1 = obj[k1];
21+
}
22+
for (let k2 in obj) {
23+
let x2 = obj[k2];
24+
}
25+
}
26+
27+
function f3<T, K extends keyof T>(obj: { [P in K]: T[P] }, k: K) {
28+
const b = k in obj;
29+
let k1: K;
30+
for (k1 in obj) {
31+
let x1 = obj[k1];
32+
}
33+
for (let k2 in obj) {
34+
let x2 = obj[k2];
35+
}
36+
}
37+
38+
//// [keyofAndForIn.js]
39+
// Repro from #12513
40+
function f1(obj, k) {
41+
var b = k in obj;
42+
var k1;
43+
for (k1 in obj) {
44+
var x1 = obj[k1];
45+
}
46+
for (var k2 in obj) {
47+
var x2 = obj[k2];
48+
}
49+
}
50+
function f2(obj, k) {
51+
var b = k in obj;
52+
var k1;
53+
for (k1 in obj) {
54+
var x1 = obj[k1];
55+
}
56+
for (var k2 in obj) {
57+
var x2 = obj[k2];
58+
}
59+
}
60+
function f3(obj, k) {
61+
var b = k in obj;
62+
var k1;
63+
for (k1 in obj) {
64+
var x1 = obj[k1];
65+
}
66+
for (var k2 in obj) {
67+
var x2 = obj[k2];
68+
}
69+
}
70+
71+
72+
//// [keyofAndForIn.d.ts]
73+
declare function f1<K extends string, T>(obj: {
74+
[P in K]: T;
75+
}, k: K): void;
76+
declare function f2<T>(obj: {
77+
[P in keyof T]: T[P];
78+
}, k: keyof T): void;
79+
declare function f3<T, K extends keyof T>(obj: {
80+
[P in K]: T[P];
81+
}, k: K): void;
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
=== tests/cases/conformance/types/keyof/keyofAndForIn.ts ===
2+
3+
// Repro from #12513
4+
5+
function f1<K extends string, T>(obj: { [P in K]: T }, k: K) {
6+
>f1 : Symbol(f1, Decl(keyofAndForIn.ts, 0, 0))
7+
>K : Symbol(K, Decl(keyofAndForIn.ts, 3, 12))
8+
>T : Symbol(T, Decl(keyofAndForIn.ts, 3, 29))
9+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 3, 33))
10+
>P : Symbol(P, Decl(keyofAndForIn.ts, 3, 41))
11+
>K : Symbol(K, Decl(keyofAndForIn.ts, 3, 12))
12+
>T : Symbol(T, Decl(keyofAndForIn.ts, 3, 29))
13+
>k : Symbol(k, Decl(keyofAndForIn.ts, 3, 54))
14+
>K : Symbol(K, Decl(keyofAndForIn.ts, 3, 12))
15+
16+
const b = k in obj;
17+
>b : Symbol(b, Decl(keyofAndForIn.ts, 4, 9))
18+
>k : Symbol(k, Decl(keyofAndForIn.ts, 3, 54))
19+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 3, 33))
20+
21+
let k1: K;
22+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 5, 7))
23+
>K : Symbol(K, Decl(keyofAndForIn.ts, 3, 12))
24+
25+
for (k1 in obj) {
26+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 5, 7))
27+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 3, 33))
28+
29+
let x1 = obj[k1];
30+
>x1 : Symbol(x1, Decl(keyofAndForIn.ts, 7, 11))
31+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 3, 33))
32+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 5, 7))
33+
}
34+
for (let k2 in obj) {
35+
>k2 : Symbol(k2, Decl(keyofAndForIn.ts, 9, 12))
36+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 3, 33))
37+
38+
let x2 = obj[k2];
39+
>x2 : Symbol(x2, Decl(keyofAndForIn.ts, 10, 11))
40+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 3, 33))
41+
>k2 : Symbol(k2, Decl(keyofAndForIn.ts, 9, 12))
42+
}
43+
}
44+
45+
function f2<T>(obj: { [P in keyof T]: T[P] }, k: keyof T) {
46+
>f2 : Symbol(f2, Decl(keyofAndForIn.ts, 12, 1))
47+
>T : Symbol(T, Decl(keyofAndForIn.ts, 14, 12))
48+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 14, 15))
49+
>P : Symbol(P, Decl(keyofAndForIn.ts, 14, 23))
50+
>T : Symbol(T, Decl(keyofAndForIn.ts, 14, 12))
51+
>T : Symbol(T, Decl(keyofAndForIn.ts, 14, 12))
52+
>P : Symbol(P, Decl(keyofAndForIn.ts, 14, 23))
53+
>k : Symbol(k, Decl(keyofAndForIn.ts, 14, 45))
54+
>T : Symbol(T, Decl(keyofAndForIn.ts, 14, 12))
55+
56+
const b = k in obj;
57+
>b : Symbol(b, Decl(keyofAndForIn.ts, 15, 9))
58+
>k : Symbol(k, Decl(keyofAndForIn.ts, 14, 45))
59+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 14, 15))
60+
61+
let k1: keyof T;
62+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 16, 7))
63+
>T : Symbol(T, Decl(keyofAndForIn.ts, 14, 12))
64+
65+
for (k1 in obj) {
66+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 16, 7))
67+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 14, 15))
68+
69+
let x1 = obj[k1];
70+
>x1 : Symbol(x1, Decl(keyofAndForIn.ts, 18, 11))
71+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 14, 15))
72+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 16, 7))
73+
}
74+
for (let k2 in obj) {
75+
>k2 : Symbol(k2, Decl(keyofAndForIn.ts, 20, 12))
76+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 14, 15))
77+
78+
let x2 = obj[k2];
79+
>x2 : Symbol(x2, Decl(keyofAndForIn.ts, 21, 11))
80+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 14, 15))
81+
>k2 : Symbol(k2, Decl(keyofAndForIn.ts, 20, 12))
82+
}
83+
}
84+
85+
function f3<T, K extends keyof T>(obj: { [P in K]: T[P] }, k: K) {
86+
>f3 : Symbol(f3, Decl(keyofAndForIn.ts, 23, 1))
87+
>T : Symbol(T, Decl(keyofAndForIn.ts, 25, 12))
88+
>K : Symbol(K, Decl(keyofAndForIn.ts, 25, 14))
89+
>T : Symbol(T, Decl(keyofAndForIn.ts, 25, 12))
90+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 25, 34))
91+
>P : Symbol(P, Decl(keyofAndForIn.ts, 25, 42))
92+
>K : Symbol(K, Decl(keyofAndForIn.ts, 25, 14))
93+
>T : Symbol(T, Decl(keyofAndForIn.ts, 25, 12))
94+
>P : Symbol(P, Decl(keyofAndForIn.ts, 25, 42))
95+
>k : Symbol(k, Decl(keyofAndForIn.ts, 25, 58))
96+
>K : Symbol(K, Decl(keyofAndForIn.ts, 25, 14))
97+
98+
const b = k in obj;
99+
>b : Symbol(b, Decl(keyofAndForIn.ts, 26, 9))
100+
>k : Symbol(k, Decl(keyofAndForIn.ts, 25, 58))
101+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 25, 34))
102+
103+
let k1: K;
104+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 27, 7))
105+
>K : Symbol(K, Decl(keyofAndForIn.ts, 25, 14))
106+
107+
for (k1 in obj) {
108+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 27, 7))
109+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 25, 34))
110+
111+
let x1 = obj[k1];
112+
>x1 : Symbol(x1, Decl(keyofAndForIn.ts, 29, 11))
113+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 25, 34))
114+
>k1 : Symbol(k1, Decl(keyofAndForIn.ts, 27, 7))
115+
}
116+
for (let k2 in obj) {
117+
>k2 : Symbol(k2, Decl(keyofAndForIn.ts, 31, 12))
118+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 25, 34))
119+
120+
let x2 = obj[k2];
121+
>x2 : Symbol(x2, Decl(keyofAndForIn.ts, 32, 11))
122+
>obj : Symbol(obj, Decl(keyofAndForIn.ts, 25, 34))
123+
>k2 : Symbol(k2, Decl(keyofAndForIn.ts, 31, 12))
124+
}
125+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
=== tests/cases/conformance/types/keyof/keyofAndForIn.ts ===
2+
3+
// Repro from #12513
4+
5+
function f1<K extends string, T>(obj: { [P in K]: T }, k: K) {
6+
>f1 : <K extends string, T>(obj: { [P in K]: T; }, k: K) => void
7+
>K : K
8+
>T : T
9+
>obj : { [P in K]: T; }
10+
>P : P
11+
>K : K
12+
>T : T
13+
>k : K
14+
>K : K
15+
16+
const b = k in obj;
17+
>b : boolean
18+
>k in obj : boolean
19+
>k : K
20+
>obj : { [P in K]: T; }
21+
22+
let k1: K;
23+
>k1 : K
24+
>K : K
25+
26+
for (k1 in obj) {
27+
>k1 : K
28+
>obj : { [P in K]: T; }
29+
30+
let x1 = obj[k1];
31+
>x1 : T
32+
>obj[k1] : T
33+
>obj : { [P in K]: T; }
34+
>k1 : K
35+
}
36+
for (let k2 in obj) {
37+
>k2 : K
38+
>obj : { [P in K]: T; }
39+
40+
let x2 = obj[k2];
41+
>x2 : T
42+
>obj[k2] : T
43+
>obj : { [P in K]: T; }
44+
>k2 : K
45+
}
46+
}
47+
48+
function f2<T>(obj: { [P in keyof T]: T[P] }, k: keyof T) {
49+
>f2 : <T>(obj: { [P in keyof T]: T[P]; }, k: keyof T) => void
50+
>T : T
51+
>obj : { [P in keyof T]: T[P]; }
52+
>P : P
53+
>T : T
54+
>T : T
55+
>P : P
56+
>k : keyof T
57+
>T : T
58+
59+
const b = k in obj;
60+
>b : boolean
61+
>k in obj : boolean
62+
>k : keyof T
63+
>obj : { [P in keyof T]: T[P]; }
64+
65+
let k1: keyof T;
66+
>k1 : keyof T
67+
>T : T
68+
69+
for (k1 in obj) {
70+
>k1 : keyof T
71+
>obj : { [P in keyof T]: T[P]; }
72+
73+
let x1 = obj[k1];
74+
>x1 : T[keyof T]
75+
>obj[k1] : T[keyof T]
76+
>obj : { [P in keyof T]: T[P]; }
77+
>k1 : keyof T
78+
}
79+
for (let k2 in obj) {
80+
>k2 : keyof T
81+
>obj : { [P in keyof T]: T[P]; }
82+
83+
let x2 = obj[k2];
84+
>x2 : T[keyof T]
85+
>obj[k2] : T[keyof T]
86+
>obj : { [P in keyof T]: T[P]; }
87+
>k2 : keyof T
88+
}
89+
}
90+
91+
function f3<T, K extends keyof T>(obj: { [P in K]: T[P] }, k: K) {
92+
>f3 : <T, K extends keyof T>(obj: { [P in K]: T[P]; }, k: K) => void
93+
>T : T
94+
>K : K
95+
>T : T
96+
>obj : { [P in K]: T[P]; }
97+
>P : P
98+
>K : K
99+
>T : T
100+
>P : P
101+
>k : K
102+
>K : K
103+
104+
const b = k in obj;
105+
>b : boolean
106+
>k in obj : boolean
107+
>k : K
108+
>obj : { [P in K]: T[P]; }
109+
110+
let k1: K;
111+
>k1 : K
112+
>K : K
113+
114+
for (k1 in obj) {
115+
>k1 : K
116+
>obj : { [P in K]: T[P]; }
117+
118+
let x1 = obj[k1];
119+
>x1 : T[K]
120+
>obj[k1] : T[K]
121+
>obj : { [P in K]: T[P]; }
122+
>k1 : K
123+
}
124+
for (let k2 in obj) {
125+
>k2 : K
126+
>obj : { [P in K]: T[P]; }
127+
128+
let x2 = obj[k2];
129+
>x2 : T[K]
130+
>obj[k2] : T[K]
131+
>obj : { [P in K]: T[P]; }
132+
>k2 : K
133+
}
134+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// @declaration: true
2+
3+
// Repro from #12513
4+
5+
function f1<K extends string, T>(obj: { [P in K]: T }, k: K) {
6+
const b = k in obj;
7+
let k1: K;
8+
for (k1 in obj) {
9+
let x1 = obj[k1];
10+
}
11+
for (let k2 in obj) {
12+
let x2 = obj[k2];
13+
}
14+
}
15+
16+
function f2<T>(obj: { [P in keyof T]: T[P] }, k: keyof T) {
17+
const b = k in obj;
18+
let k1: keyof T;
19+
for (k1 in obj) {
20+
let x1 = obj[k1];
21+
}
22+
for (let k2 in obj) {
23+
let x2 = obj[k2];
24+
}
25+
}
26+
27+
function f3<T, K extends keyof T>(obj: { [P in K]: T[P] }, k: K) {
28+
const b = k in obj;
29+
let k1: K;
30+
for (k1 in obj) {
31+
let x1 = obj[k1];
32+
}
33+
for (let k2 in obj) {
34+
let x2 = obj[k2];
35+
}
36+
}

0 commit comments

Comments
 (0)