==== tests/cases/compiler/objectTypesIdentityWithOptionality.ts (3 errors) ====
    // object types are identical structurally
    
    class A {
        foo: string;
    }
    
    class B {
        foo: string;
    }
    
    class C<T> {
        foo: T;
    }
    
    interface I {
        foo?: string;
    }
    
    var a: { foo?: string; }
    var b = { foo: '' };
    
    function foo2(x: I);
    function foo2(x: I); // error
    ~~~~~~~~~~~~~~~~~~~~
!!! objectTypesIdentityWithOptionality.ts(23,1): error TS2144: Duplicate overload signature for 'foo2'.
    function foo2(x: any) { }
    
    function foo3(x: typeof a);
    function foo3(x: typeof a); // error
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! objectTypesIdentityWithOptionality.ts(27,1): error TS2144: Duplicate overload signature for 'foo3'.
    function foo3(x: any) { }
    
    function foo6(x: A);
    function foo6(x: I); // ok
    function foo6(x: any) { }
    
    function foo7(x: A);
    function foo7(x: typeof a); // ok
    function foo7(x: any) { }
    
    function foo8(x: B);
    function foo8(x: I); // ok
    function foo8(x: any) { }
    
    function foo10(x: B);
    function foo10(x: typeof a); // ok
    function foo10(x: any) { }
    
    function foo12(x: I);
    function foo12(x: C<string>); // ok
    function foo12(x: any) { }
    
    function foo13(x: I);
    function foo13(x: typeof a); // error
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! objectTypesIdentityWithOptionality.ts(51,1): error TS2144: Duplicate overload signature for 'foo13'.
    function foo13(x: any) { }
    
    function foo14(x: I);
    function foo14(x: typeof b); // ok
    function foo14(x: any) { }