tests/cases/conformance/types/union/discriminatedUnionTypes2.ts(27,30): error TS2322: Type '{ a: null; b: string; c: number; }' is not assignable to type '{ a: null; b: string; } | { a: string; c: number; }'.
  Object literal may only specify known properties, and 'c' does not exist in type '{ a: null; b: string; }'.
tests/cases/conformance/types/union/discriminatedUnionTypes2.ts(32,11): error TS2339: Property 'b' does not exist on type '{ a: 0; b: string; } | { a: T; c: number; }'.
  Property 'b' does not exist on type '{ a: T; c: number; }'.
tests/cases/conformance/types/union/discriminatedUnionTypes2.ts(132,11): error TS2339: Property 'value' does not exist on type 'never'.


==== tests/cases/conformance/types/union/discriminatedUnionTypes2.ts (3 errors) ====
    function f10(x : { kind: false, a: string } | { kind: true, b: string } | { kind: string, c: string }) {
        if (x.kind === false) {
            x.a;
        }
        else if (x.kind === true) {
            x.b;
        }
        else {
            x.c;
        }
    }
    
    function f11(x : { kind: false, a: string } | { kind: true, b: string } | { kind: string, c: string }) {
        switch (x.kind) {
            case false:
                x.a;
                break;
            case true:
                x.b;
                break;
            default:
                x.c;
        }
    }
    
    function f13(x: { a: null; b: string } | { a: string, c: number }) {
        x = { a: null, b: "foo", c: 4};  // Error
                                 ~~~~
!!! error TS2322: Type '{ a: null; b: string; c: number; }' is not assignable to type '{ a: null; b: string; } | { a: string; c: number; }'.
!!! error TS2322:   Object literal may only specify known properties, and 'c' does not exist in type '{ a: null; b: string; }'.
    }
    
    function f14<T>(x: { a: 0; b: string } | { a: T, c: number }) {
        if (x.a === 0) {
            x.b;  // Error
              ~
!!! error TS2339: Property 'b' does not exist on type '{ a: 0; b: string; } | { a: T; c: number; }'.
!!! error TS2339:   Property 'b' does not exist on type '{ a: T; c: number; }'.
        }
    }
    
    type Result<T> = { error?: undefined, value: T } | { error: Error };
    
    function f15(x: Result<number>) {
        if (!x.error) {
            x.value;
        }
        else {
            x.error.message;
        }
    }
    
    f15({ value: 10 });
    f15({ error: new Error("boom") });
    
    // Repro from #24193
    
    interface WithError {
        error: Error
        data: null
    }
    
    interface WithoutError<Data> {
        error: null
        data: Data
    }
    
    type DataCarrier<Data> = WithError | WithoutError<Data>
    
    function f20<Data>(carrier: DataCarrier<Data>) {
        if (carrier.error === null) {
            const error: null = carrier.error
            const data: Data = carrier.data
        } else {
            const error: Error = carrier.error
            const data: null = carrier.data
        }
    }
    
    // Repro from #28935
    
    type Foo = { tag: true, x: number } | { tag: false, y: number } | { [x: string]: string };
    
    function f30(foo: Foo) {
        if (foo.tag) {
            foo;
        }
        else {
            foo;
        }
    }
    
    function f31(foo: Foo) {
        if (foo.tag === true) {
            foo;
        }
        else {
            foo;
        }
    }
    
    // Repro from #33448
    
    type a = {
        type: 'a',
        data: string
    }
    type b = {
        type: 'b',
        name: string
    }
    type c = {
        type: 'c',
        other: string
    }
    
    type abc = a | b | c;
    
    function f(problem: abc & (b | c)) {
        if (problem.type === 'b') {
            problem.name;
        }
        else {
            problem.other;
        }
    }
    
    type RuntimeValue =
        | { type: 'number', value: number }
        | { type: 'string', value: string }
        | { type: 'boolean', value: boolean };
    
    function foo1(x: RuntimeValue & { type: 'number' }) {
        if (x.type === 'number') {
            x.value;  // number
        }
        else {
            x.value;  // Error, x is never
              ~~~~~
!!! error TS2339: Property 'value' does not exist on type 'never'.
        }
    }
    
    function foo2(x: RuntimeValue & ({ type: 'number' } | { type: 'string' })) {
        if (x.type === 'number') {
            x.value;  // number
        }
        else {
            x.value;  // string
        }
    }
    