Skip to content

Commit 9971847

Browse files
committed
Add tests
1 parent ecd10be commit 9971847

File tree

4 files changed

+1068
-0
lines changed

4 files changed

+1068
-0
lines changed
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
//// [isomorphicMappedTypeInference.ts]
2+
3+
type Box<T> = {
4+
value: T;
5+
}
6+
7+
type Boxified<T> = {
8+
[P in keyof T]: Box<T[P]>;
9+
}
10+
11+
function box<T>(x: T): Box<T> {
12+
return { value: x };
13+
}
14+
15+
function unbox<T>(x: Box<T>): T {
16+
return x.value;
17+
}
18+
19+
function boxify<T>(obj: T): Boxified<T> {
20+
let result = {} as Boxified<T>;
21+
for (let k in obj) {
22+
result[k] = box(obj[k]);
23+
}
24+
return result;
25+
}
26+
27+
function unboxify<T>(obj: Boxified<T>): T {
28+
let result = {} as T;
29+
for (let k in obj) {
30+
result[k] = unbox(obj[k]);
31+
}
32+
return result;
33+
}
34+
35+
function assignBoxified<T>(obj: Boxified<T>, values: T) {
36+
for (let k in values) {
37+
obj[k].value = values[k];
38+
}
39+
}
40+
41+
function f1() {
42+
let v = {
43+
a: 42,
44+
b: "hello",
45+
c: true
46+
};
47+
let b = boxify(v);
48+
let x: number = b.a.value;
49+
}
50+
51+
function f2() {
52+
let b = {
53+
a: box(42),
54+
b: box("hello"),
55+
c: box(true)
56+
};
57+
let v = unboxify(b);
58+
let x: number = v.a;
59+
}
60+
61+
function f3() {
62+
let b = {
63+
a: box(42),
64+
b: box("hello"),
65+
c: box(true)
66+
};
67+
assignBoxified(b, { c: false });
68+
}
69+
70+
function f4() {
71+
let b = {
72+
a: box(42),
73+
b: box("hello"),
74+
c: box(true)
75+
};
76+
b = boxify(unboxify(b));
77+
b = unboxify(boxify(b));
78+
}
79+
80+
function makeRecord<T, K extends string>(obj: { [P in K]: T }) {
81+
return obj;
82+
}
83+
84+
function f5(s: string) {
85+
let b = makeRecord({
86+
a: box(42),
87+
b: box("hello"),
88+
c: box(true)
89+
});
90+
let v = unboxify(b);
91+
let x: string | number | boolean = v.a;
92+
}
93+
94+
function makeDictionary<T>(obj: { [x: string]: T }) {
95+
return obj;
96+
}
97+
98+
function f6(s: string) {
99+
let b = makeDictionary({
100+
a: box(42),
101+
b: box("hello"),
102+
c: box(true)
103+
});
104+
let v = unboxify(b);
105+
let x: string | number | boolean = v[s];
106+
}
107+
108+
//// [isomorphicMappedTypeInference.js]
109+
function box(x) {
110+
return { value: x };
111+
}
112+
function unbox(x) {
113+
return x.value;
114+
}
115+
function boxify(obj) {
116+
var result = {};
117+
for (var k in obj) {
118+
result[k] = box(obj[k]);
119+
}
120+
return result;
121+
}
122+
function unboxify(obj) {
123+
var result = {};
124+
for (var k in obj) {
125+
result[k] = unbox(obj[k]);
126+
}
127+
return result;
128+
}
129+
function assignBoxified(obj, values) {
130+
for (var k in values) {
131+
obj[k].value = values[k];
132+
}
133+
}
134+
function f1() {
135+
var v = {
136+
a: 42,
137+
b: "hello",
138+
c: true
139+
};
140+
var b = boxify(v);
141+
var x = b.a.value;
142+
}
143+
function f2() {
144+
var b = {
145+
a: box(42),
146+
b: box("hello"),
147+
c: box(true)
148+
};
149+
var v = unboxify(b);
150+
var x = v.a;
151+
}
152+
function f3() {
153+
var b = {
154+
a: box(42),
155+
b: box("hello"),
156+
c: box(true)
157+
};
158+
assignBoxified(b, { c: false });
159+
}
160+
function f4() {
161+
var b = {
162+
a: box(42),
163+
b: box("hello"),
164+
c: box(true)
165+
};
166+
b = boxify(unboxify(b));
167+
b = unboxify(boxify(b));
168+
}
169+
function makeRecord(obj) {
170+
return obj;
171+
}
172+
function f5(s) {
173+
var b = makeRecord({
174+
a: box(42),
175+
b: box("hello"),
176+
c: box(true)
177+
});
178+
var v = unboxify(b);
179+
var x = v.a;
180+
}
181+
function makeDictionary(obj) {
182+
return obj;
183+
}
184+
function f6(s) {
185+
var b = makeDictionary({
186+
a: box(42),
187+
b: box("hello"),
188+
c: box(true)
189+
});
190+
var v = unboxify(b);
191+
var x = v[s];
192+
}
193+
194+
195+
//// [isomorphicMappedTypeInference.d.ts]
196+
declare type Box<T> = {
197+
value: T;
198+
};
199+
declare type Boxified<T> = {
200+
[P in keyof T]: Box<T[P]>;
201+
};
202+
declare function box<T>(x: T): Box<T>;
203+
declare function unbox<T>(x: Box<T>): T;
204+
declare function boxify<T>(obj: T): Boxified<T>;
205+
declare function unboxify<T>(obj: Boxified<T>): T;
206+
declare function assignBoxified<T>(obj: Boxified<T>, values: T): void;
207+
declare function f1(): void;
208+
declare function f2(): void;
209+
declare function f3(): void;
210+
declare function f4(): void;
211+
declare function makeRecord<T, K extends string>(obj: {
212+
[P in K]: T;
213+
}): {
214+
[P in K]: T;
215+
};
216+
declare function f5(s: string): void;
217+
declare function makeDictionary<T>(obj: {
218+
[x: string]: T;
219+
}): {
220+
[x: string]: T;
221+
};
222+
declare function f6(s: string): void;

0 commit comments

Comments
 (0)