class C { foo(): T { return null } } interface I { bar(): T; } var c1: C; var i1: I; var c2: C; var i2: I; function foo(x: C, y: I) { } function foo2(x: C, y: I) { } var x: { a: C } = { a: new C() }; var x2: { a: I } = { a: { bar() { return 1 } } }; class D { x: C; y: D; } interface J { x: I; y: J; } class A { } function f(x: T): A { return null; }