=== tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts ===
class Base {
>Base : Base

    public a: string;
>a : string
}

class Derived extends Base {
>Derived : Derived
>Base : Base

    public b: string;
>b : string
}

var a1: { [a: string]: string };
>a1 : { [x: string]: string; }
>a : string

var b1: { [b: string]: string };
>b1 : { [x: string]: string; }
>b : string

var a2: { [index: string]: Base };
>a2 : { [x: string]: Base; }
>index : string
>Base : Base

var b2: { [index: string]: Derived };
>b2 : { [x: string]: Derived; }
>index : string
>Derived : Derived

var a3: { [index: number]: string };
>a3 : { [x: number]: string; }
>index : number

var b3: { [index: number]: string };
>b3 : { [x: number]: string; }
>index : number

var a4: { [index: number]: Base };
>a4 : { [x: number]: Base; }
>index : number
>Base : Base

var b4: { [index: string]: Derived };
>b4 : { [x: string]: Derived; }
>index : string
>Derived : Derived

// operator <
var r1a1 = a1 < b1;
>r1a1 : boolean
>a1 < b1 : boolean
>a1 : { [x: string]: string; }
>b1 : { [x: string]: string; }

var r1a1 = a2 < b2;
>r1a1 : boolean
>a2 < b2 : boolean
>a2 : { [x: string]: Base; }
>b2 : { [x: string]: Derived; }

var r1a1 = a3 < b3;
>r1a1 : boolean
>a3 < b3 : boolean
>a3 : { [x: number]: string; }
>b3 : { [x: number]: string; }

var r1a1 = a4 < b4;
>r1a1 : boolean
>a4 < b4 : boolean
>a4 : { [x: number]: Base; }
>b4 : { [x: string]: Derived; }

var r1b1 = b1 < a1;
>r1b1 : boolean
>b1 < a1 : boolean
>b1 : { [x: string]: string; }
>a1 : { [x: string]: string; }

var r1b1 = b2 < a2;
>r1b1 : boolean
>b2 < a2 : boolean
>b2 : { [x: string]: Derived; }
>a2 : { [x: string]: Base; }

var r1b1 = b3 < a3;
>r1b1 : boolean
>b3 < a3 : boolean
>b3 : { [x: number]: string; }
>a3 : { [x: number]: string; }

var r1b1 = b4 < a4;
>r1b1 : boolean
>b4 < a4 : boolean
>b4 : { [x: string]: Derived; }
>a4 : { [x: number]: Base; }

// operator >
var r2a1 = a1 > b1;
>r2a1 : boolean
>a1 > b1 : boolean
>a1 : { [x: string]: string; }
>b1 : { [x: string]: string; }

var r2a1 = a2 > b2;
>r2a1 : boolean
>a2 > b2 : boolean
>a2 : { [x: string]: Base; }
>b2 : { [x: string]: Derived; }

var r2a1 = a3 > b3;
>r2a1 : boolean
>a3 > b3 : boolean
>a3 : { [x: number]: string; }
>b3 : { [x: number]: string; }

var r2a1 = a4 > b4;
>r2a1 : boolean
>a4 > b4 : boolean
>a4 : { [x: number]: Base; }
>b4 : { [x: string]: Derived; }

var r2b1 = b1 > a1;
>r2b1 : boolean
>b1 > a1 : boolean
>b1 : { [x: string]: string; }
>a1 : { [x: string]: string; }

var r2b1 = b2 > a2;
>r2b1 : boolean
>b2 > a2 : boolean
>b2 : { [x: string]: Derived; }
>a2 : { [x: string]: Base; }

var r2b1 = b3 > a3;
>r2b1 : boolean
>b3 > a3 : boolean
>b3 : { [x: number]: string; }
>a3 : { [x: number]: string; }

var r2b1 = b4 > a4;
>r2b1 : boolean
>b4 > a4 : boolean
>b4 : { [x: string]: Derived; }
>a4 : { [x: number]: Base; }

// operator <=
var r3a1 = a1 <= b1;
>r3a1 : boolean
>a1 <= b1 : boolean
>a1 : { [x: string]: string; }
>b1 : { [x: string]: string; }

var r3a1 = a2 <= b2;
>r3a1 : boolean
>a2 <= b2 : boolean
>a2 : { [x: string]: Base; }
>b2 : { [x: string]: Derived; }

var r3a1 = a3 <= b3;
>r3a1 : boolean
>a3 <= b3 : boolean
>a3 : { [x: number]: string; }
>b3 : { [x: number]: string; }

var r3a1 = a4 <= b4;
>r3a1 : boolean
>a4 <= b4 : boolean
>a4 : { [x: number]: Base; }
>b4 : { [x: string]: Derived; }

var r3b1 = b1 <= a1;
>r3b1 : boolean
>b1 <= a1 : boolean
>b1 : { [x: string]: string; }
>a1 : { [x: string]: string; }

var r3b1 = b2 <= a2;
>r3b1 : boolean
>b2 <= a2 : boolean
>b2 : { [x: string]: Derived; }
>a2 : { [x: string]: Base; }

var r3b1 = b3 <= a3;
>r3b1 : boolean
>b3 <= a3 : boolean
>b3 : { [x: number]: string; }
>a3 : { [x: number]: string; }

var r3b1 = b4 <= a4;
>r3b1 : boolean
>b4 <= a4 : boolean
>b4 : { [x: string]: Derived; }
>a4 : { [x: number]: Base; }

// operator >=
var r4a1 = a1 >= b1;
>r4a1 : boolean
>a1 >= b1 : boolean
>a1 : { [x: string]: string; }
>b1 : { [x: string]: string; }

var r4a1 = a2 >= b2;
>r4a1 : boolean
>a2 >= b2 : boolean
>a2 : { [x: string]: Base; }
>b2 : { [x: string]: Derived; }

var r4a1 = a3 >= b3;
>r4a1 : boolean
>a3 >= b3 : boolean
>a3 : { [x: number]: string; }
>b3 : { [x: number]: string; }

var r4a1 = a4 >= b4;
>r4a1 : boolean
>a4 >= b4 : boolean
>a4 : { [x: number]: Base; }
>b4 : { [x: string]: Derived; }

var r4b1 = b1 >= a1;
>r4b1 : boolean
>b1 >= a1 : boolean
>b1 : { [x: string]: string; }
>a1 : { [x: string]: string; }

var r4b1 = b2 >= a2;
>r4b1 : boolean
>b2 >= a2 : boolean
>b2 : { [x: string]: Derived; }
>a2 : { [x: string]: Base; }

var r4b1 = b3 >= a3;
>r4b1 : boolean
>b3 >= a3 : boolean
>b3 : { [x: number]: string; }
>a3 : { [x: number]: string; }

var r4b1 = b4 >= a4;
>r4b1 : boolean
>b4 >= a4 : boolean
>b4 : { [x: string]: Derived; }
>a4 : { [x: number]: Base; }

// operator ==
var r5a1 = a1 == b1;
>r5a1 : boolean
>a1 == b1 : boolean
>a1 : { [x: string]: string; }
>b1 : { [x: string]: string; }

var r5a1 = a2 == b2;
>r5a1 : boolean
>a2 == b2 : boolean
>a2 : { [x: string]: Base; }
>b2 : { [x: string]: Derived; }

var r5a1 = a3 == b3;
>r5a1 : boolean
>a3 == b3 : boolean
>a3 : { [x: number]: string; }
>b3 : { [x: number]: string; }

var r5a1 = a4 == b4;
>r5a1 : boolean
>a4 == b4 : boolean
>a4 : { [x: number]: Base; }
>b4 : { [x: string]: Derived; }

var r5b1 = b1 == a1;
>r5b1 : boolean
>b1 == a1 : boolean
>b1 : { [x: string]: string; }
>a1 : { [x: string]: string; }

var r5b1 = b2 == a2;
>r5b1 : boolean
>b2 == a2 : boolean
>b2 : { [x: string]: Derived; }
>a2 : { [x: string]: Base; }

var r5b1 = b3 == a3;
>r5b1 : boolean
>b3 == a3 : boolean
>b3 : { [x: number]: string; }
>a3 : { [x: number]: string; }

var r5b1 = b4 == a4;
>r5b1 : boolean
>b4 == a4 : boolean
>b4 : { [x: string]: Derived; }
>a4 : { [x: number]: Base; }

// operator !=
var r6a1 = a1 != b1;
>r6a1 : boolean
>a1 != b1 : boolean
>a1 : { [x: string]: string; }
>b1 : { [x: string]: string; }

var r6a1 = a2 != b2;
>r6a1 : boolean
>a2 != b2 : boolean
>a2 : { [x: string]: Base; }
>b2 : { [x: string]: Derived; }

var r6a1 = a3 != b3;
>r6a1 : boolean
>a3 != b3 : boolean
>a3 : { [x: number]: string; }
>b3 : { [x: number]: string; }

var r6a1 = a4 != b4;
>r6a1 : boolean
>a4 != b4 : boolean
>a4 : { [x: number]: Base; }
>b4 : { [x: string]: Derived; }

var r6b1 = b1 != a1;
>r6b1 : boolean
>b1 != a1 : boolean
>b1 : { [x: string]: string; }
>a1 : { [x: string]: string; }

var r6b1 = b2 != a2;
>r6b1 : boolean
>b2 != a2 : boolean
>b2 : { [x: string]: Derived; }
>a2 : { [x: string]: Base; }

var r6b1 = b3 != a3;
>r6b1 : boolean
>b3 != a3 : boolean
>b3 : { [x: number]: string; }
>a3 : { [x: number]: string; }

var r6b1 = b4 != a4;
>r6b1 : boolean
>b4 != a4 : boolean
>b4 : { [x: string]: Derived; }
>a4 : { [x: number]: Base; }

// operator ===
var r7a1 = a1 === b1;
>r7a1 : boolean
>a1 === b1 : boolean
>a1 : { [x: string]: string; }
>b1 : { [x: string]: string; }

var r7a1 = a2 === b2;
>r7a1 : boolean
>a2 === b2 : boolean
>a2 : { [x: string]: Base; }
>b2 : { [x: string]: Derived; }

var r7a1 = a3 === b3;
>r7a1 : boolean
>a3 === b3 : boolean
>a3 : { [x: number]: string; }
>b3 : { [x: number]: string; }

var r7a1 = a4 === b4;
>r7a1 : boolean
>a4 === b4 : boolean
>a4 : { [x: number]: Base; }
>b4 : { [x: string]: Derived; }

var r7b1 = b1 === a1;
>r7b1 : boolean
>b1 === a1 : boolean
>b1 : { [x: string]: string; }
>a1 : { [x: string]: string; }

var r7b1 = b2 === a2;
>r7b1 : boolean
>b2 === a2 : boolean
>b2 : { [x: string]: Derived; }
>a2 : { [x: string]: Base; }

var r7b1 = b3 === a3;
>r7b1 : boolean
>b3 === a3 : boolean
>b3 : { [x: number]: string; }
>a3 : { [x: number]: string; }

var r7b1 = b4 === a4;
>r7b1 : boolean
>b4 === a4 : boolean
>b4 : { [x: string]: Derived; }
>a4 : { [x: number]: Base; }

// operator !==
var r8a1 = a1 !== b1;
>r8a1 : boolean
>a1 !== b1 : boolean
>a1 : { [x: string]: string; }
>b1 : { [x: string]: string; }

var r8a1 = a2 !== b2;
>r8a1 : boolean
>a2 !== b2 : boolean
>a2 : { [x: string]: Base; }
>b2 : { [x: string]: Derived; }

var r8a1 = a3 !== b3;
>r8a1 : boolean
>a3 !== b3 : boolean
>a3 : { [x: number]: string; }
>b3 : { [x: number]: string; }

var r8a1 = a4 !== b4;
>r8a1 : boolean
>a4 !== b4 : boolean
>a4 : { [x: number]: Base; }
>b4 : { [x: string]: Derived; }

var r8b1 = b1 !== a1;
>r8b1 : boolean
>b1 !== a1 : boolean
>b1 : { [x: string]: string; }
>a1 : { [x: string]: string; }

var r8b1 = b2 !== a2;
>r8b1 : boolean
>b2 !== a2 : boolean
>b2 : { [x: string]: Derived; }
>a2 : { [x: string]: Base; }

var r8b1 = b3 !== a3;
>r8b1 : boolean
>b3 !== a3 : boolean
>b3 : { [x: number]: string; }
>a3 : { [x: number]: string; }

var r8b1 = b4 !== a4;
>r8b1 : boolean
>b4 !== a4 : boolean
>b4 : { [x: string]: Derived; }
>a4 : { [x: number]: Base; }

