logicalOrOperatorWithTypeParameters.ts(5,9): error TS2322: Type 'U | NonNullable<T>' is not assignable to type '{}'.
  Type 'U' is not assignable to type '{}'.
logicalOrOperatorWithTypeParameters.ts(14,9): error TS2322: Type 'V | NonNullable<U>' is not assignable to type '{}'.
  Type 'V' is not assignable to type '{}'.


==== logicalOrOperatorWithTypeParameters.ts (2 errors) ====
    function fn1<T, U>(t: T, u: U) {
        var r1 = t || t;
        var r2: T = t || t;
        var r3 = t || u;
        var r4: {} = t || u;
            ~~
!!! error TS2322: Type 'U | NonNullable<T>' is not assignable to type '{}'.
!!! error TS2322:   Type 'U' is not assignable to type '{}'.
!!! related TS2208 logicalOrOperatorWithTypeParameters.ts:1:17: This type parameter might need an `extends {}` constraint.
    }
    
    function fn2<T, U/* extends T*/, V/* extends T*/>(t: T, u: U, v: V) {
        var r1 = t || u;
        //var r2: T = t || u;
        var r3 = u || u;
        var r4: U = u || u;
        var r5 = u || v;
        var r6: {} = u || v;
            ~~
!!! error TS2322: Type 'V | NonNullable<U>' is not assignable to type '{}'.
!!! error TS2322:   Type 'V' is not assignable to type '{}'.
!!! related TS2208 logicalOrOperatorWithTypeParameters.ts:8:34: This type parameter might need an `extends {}` constraint.
        //var r7: T = u || v;
    }
    
    function fn3<T extends { a: string; b: string }, U extends { a: string; b: number }>(t: T, u: U) {
        var r1 = t || u;
        var r2: {} = t || u;
        var r3 = t || { a: '' };
        var r4: { a: string } = t || u;
    }