• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1type Tree<T> = T | { left: Tree<T>, right: Tree<T> };
2
3var tree: Tree<number> = {
4    left: {
5        left: 0,
6        right: {
7            left: 1,
8            right: 2
9        },
10    },
11    right: 3
12};
13
14type Lazy<T> = T | (() => T);
15
16var ls: Lazy<string>;
17ls = "eager";
18ls = () => "lazy";
19
20type Foo<T> = T | { x: Foo<T> };
21type Bar<U> = U | { x: Bar<U> };
22
23// Deeply instantiated generics
24var x: Foo<string>;
25var y: Bar<string>;
26x = y;
27y = x;
28
29x = "string";
30x = { x: "hello" };
31x = { x: { x: "world" } };
32
33var z: Foo<number>;
34z = 42;
35z = { x: 42 };
36z = { x: { x: 42 } };
37
38type Strange<T> = string;  // Type parameter not used
39var s: Strange<number>;
40s = "hello";
41
42interface AB<A, B> {
43    a: A;
44    b: B;
45}
46
47type Pair<T> = AB<T, T>;
48
49interface TaggedPair<T> extends Pair<T> {
50    tag: string;
51}
52
53var p: TaggedPair<number>;
54p.a = 1;
55p.b = 2;
56p.tag = "test";
57
58function f<A>() {
59    type Foo<T> = T | { x: Foo<T> };
60    var x: Foo<A[]>;
61    return x;
62}
63
64function g<B>() {
65    type Bar<U> = U | { x: Bar<U> };
66    var x: Bar<B[]>;
67    return x;
68}
69
70// Deeply instantiated generics
71var a = f<string>();
72var b = g<string>();
73a = b;
74