subtypingWithObjectMembersOptionality.ts(41,16): error TS2352: Conversion of type 'null' to type 'Derived' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
subtypingWithObjectMembersOptionality.ts(42,16): error TS2454: Variable 'a' is used before being assigned.
subtypingWithObjectMembersOptionality.ts(71,20): error TS2352: Conversion of type 'null' to type 'Derived2' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
subtypingWithObjectMembersOptionality.ts(72,20): error TS2454: Variable 'a' is used before being assigned.


==== subtypingWithObjectMembersOptionality.ts (4 errors) ====
    // Derived member is not optional but base member is, should be ok
    
    interface Base { foo: string; }
    interface Derived extends Base { bar: string; }
    interface Derived2 extends Derived { baz: string; }
    
    // S is a subtype of a type T, and T is a supertype of S, if one of the following is true, where S' denotes the apparent type (section 3.8.1) of S:
    //   - S' and T are object types and, for each member M in T, one of the following is true:
    //      - M is a property and S' contains a property N where
    //          M and N have the same name,
    //          the type of N is a subtype of that of M,
    //          M and N are both public or both private, and
    //          if M is a required property, N is also a required property.
    //      - M is an optional property and S' contains no property of the same name as M.
    interface T {
        Foo?: Base;
    }
    
    interface S extends T {
        Foo: Derived
    }
    
    interface T2 {
        1?: Base; 
    }
    
    interface S2 extends T2 {
        1: Derived;
    }
    
    interface T3 {
        '1'?: Base;
    }
    
    interface S3 extends T3 {
        '1.': Derived;
    }
    
    // object literal case
    var a: { Foo?: Base; };
    var b = { Foo: <Derived>null };
                   ~~~~~~~~~~~~~
!!! error TS2352: Conversion of type 'null' to type 'Derived' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
    var r = true ? a : b;
                   ~
!!! error TS2454: Variable 'a' is used before being assigned.
    
    namespace TwoLevels {
        interface T {
            Foo?: Base;
        }
    
        interface S extends T {
            Foo: Derived2 
        }
    
        interface T2 {
            1?: Base;
        }
    
        interface S2 extends T2 {
            1: Derived2;
        }
    
        interface T3 {
            '1'?: Base;
        }
    
        interface S3 extends T3 {
            '1.': Derived2;
        }
    
        // object literal case
        var a: { Foo?: Base; };
        var b = { Foo: <Derived2>null };
                       ~~~~~~~~~~~~~~
!!! error TS2352: Conversion of type 'null' to type 'Derived2' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
        var r = true ? a : b;
                       ~
!!! error TS2454: Variable 'a' is used before being assigned.
    }