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