intersectionTypeMembers.ts(9,1): error TS2454: Variable 'abc' is used before being assigned.
intersectionTypeMembers.ts(10,1): error TS2454: Variable 'abc' is used before being assigned.
intersectionTypeMembers.ts(11,1): error TS2454: Variable 'abc' is used before being assigned.
intersectionTypeMembers.ts(18,1): error TS2454: Variable 'xyz' is used before being assigned.
intersectionTypeMembers.ts(19,1): error TS2454: Variable 'xyz' is used before being assigned.
intersectionTypeMembers.ts(20,1): error TS2454: Variable 'xyz' is used before being assigned.
intersectionTypeMembers.ts(26,9): error TS2454: Variable 'f' is used before being assigned.
intersectionTypeMembers.ts(27,9): error TS2454: Variable 'f' is used before being assigned.


==== intersectionTypeMembers.ts (8 errors) ====
    // An intersection type has those members that are present in any of its constituent types,
    // with types that are intersections of the respective members in the constituent types
    
    interface A { a: string }
    interface B { b: string }
    interface C { c: string }
    
    var abc: A & B & C;
    abc.a = "hello";
    ~~~
!!! error TS2454: Variable 'abc' is used before being assigned.
    abc.b = "hello";
    ~~~
!!! error TS2454: Variable 'abc' is used before being assigned.
    abc.c = "hello";
    ~~~
!!! error TS2454: Variable 'abc' is used before being assigned.
    
    interface X { x: A }
    interface Y { x: B }
    interface Z { x: C }
    
    var xyz: X & Y & Z;
    xyz.x.a = "hello";
    ~~~
!!! error TS2454: Variable 'xyz' is used before being assigned.
    xyz.x.b = "hello";
    ~~~
!!! error TS2454: Variable 'xyz' is used before being assigned.
    xyz.x.c = "hello";
    ~~~
!!! error TS2454: Variable 'xyz' is used before being assigned.
    
    type F1 = (x: string) => string;
    type F2 = (x: number) => number;
    
    var f: F1 & F2;
    var s = f("hello");
            ~
!!! error TS2454: Variable 'f' is used before being assigned.
    var n = f(42);
            ~
!!! error TS2454: Variable 'f' is used before being assigned.
    
    interface D {
        nested: { doublyNested: { d: string; }, different: { e: number } };
    }
    interface E {
        nested: { doublyNested: { f: string; }, other: {g: number } };
    }
    const de: D & E = {
        nested: {
            doublyNested: {
                d: 'yes',
                f: 'no'
            },
            different: { e: 12 },
            other: { g: 101 }
        }
    }
    
    // Additional test case with >2 doubly nested members so fix for #31441 is tested w/ excess props
    interface F {
        nested: { doublyNested: { g: string; } }
    }
    
    interface G {
        nested: { doublyNested: { h: string; } }
    }
    
    const defg: D & E & F & G = {
        nested: {
            doublyNested: {
                d: 'yes',
                f: 'no',
                g: 'ok',
                h: 'affirmative'
            },
            different: { e: 12 },
            other: { g: 101 }
        }
    }
    