tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(17,7): error TS2415: Class 'D3<T, U>' incorrectly extends base class 'C3<T>'.
  Types of property 'foo' are incompatible.
    Type 'U' is not assignable to type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(19,5): error TS2411: Property 'foo' of type 'U' is not assignable to string index type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(48,7): error TS2415: Class 'D8<T, U, V>' incorrectly extends base class 'C3<T>'.
  Types of property 'foo' are incompatible.
    Type 'U' is not assignable to type 'T'.
      Type 'V' is not assignable to type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(50,5): error TS2411: Property 'foo' of type 'U' is not assignable to string index type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(65,7): error TS2415: Class 'D11<T, U, V>' incorrectly extends base class 'C3<T>'.
  Types of property 'foo' are incompatible.
    Type 'V' is not assignable to type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(67,5): error TS2411: Property 'foo' of type 'V' is not assignable to string index type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(70,7): error TS2415: Class 'D12<T, U, V>' incorrectly extends base class 'C3<U>'.
  Types of property 'foo' are incompatible.
    Type 'V' is not assignable to type 'U'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(72,5): error TS2411: Property 'foo' of type 'V' is not assignable to string index type 'U'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(110,7): error TS2415: Class 'D19<T, U, V>' incorrectly extends base class 'C3<T>'.
  Types of property 'foo' are incompatible.
    Type 'U' is not assignable to type 'T'.
      Type 'V' is not assignable to type 'T'.
        Type 'Date' is not assignable to type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(112,5): error TS2411: Property 'foo' of type 'U' is not assignable to string index type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(132,7): error TS2415: Class 'D23<T, U, V>' incorrectly extends base class 'C3<T>'.
  Types of property 'foo' are incompatible.
    Type 'V' is not assignable to type 'T'.
      Type 'Date' is not assignable to type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(134,5): error TS2411: Property 'foo' of type 'V' is not assignable to string index type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(137,7): error TS2415: Class 'D24<T, U, V>' incorrectly extends base class 'C3<U>'.
  Types of property 'foo' are incompatible.
    Type 'V' is not assignable to type 'U'.
      Type 'Date' is not assignable to type 'U'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(139,5): error TS2411: Property 'foo' of type 'V' is not assignable to string index type 'U'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(154,7): error TS2415: Class 'D27<T, U, V>' incorrectly extends base class 'C3<T>'.
  Types of property 'foo' are incompatible.
    Type 'Date' is not assignable to type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(156,5): error TS2411: Property 'foo' of type 'Date' is not assignable to string index type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(159,7): error TS2415: Class 'D28<T, U, V>' incorrectly extends base class 'C3<U>'.
  Types of property 'foo' are incompatible.
    Type 'Date' is not assignable to type 'U'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(161,5): error TS2411: Property 'foo' of type 'Date' is not assignable to string index type 'U'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(164,7): error TS2415: Class 'D29<T, U, V>' incorrectly extends base class 'C3<V>'.
  Types of property 'foo' are incompatible.
    Type 'Date' is not assignable to type 'V'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts(166,5): error TS2411: Property 'foo' of type 'Date' is not assignable to string index type 'V'.


==== tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints.ts (20 errors) ====
    // checking whether other types are subtypes of type parameters with constraints
    
    class C3<T> {
        foo: T;
    }
    
    class D1<T extends U, U> extends C3<T> {
        [x: string]: T;
        foo: T; // ok
    }
    
    class D2<T extends U, U> extends C3<U> {
        [x: string]: U;
        foo: T; // ok
    }
    
    class D3<T extends U, U> extends C3<T> {
          ~~
!!! error TS2415: Class 'D3<T, U>' incorrectly extends base class 'C3<T>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'U' is not assignable to type 'T'.
        [x: string]: T;
        foo: U; // error
        ~~~~~~~
!!! error TS2411: Property 'foo' of type 'U' is not assignable to string index type 'T'.
    }
    
    class D4<T extends U, U> extends C3<U> {
        [x: string]: U;
        foo: U; // ok
    }
    
    
    // V > U > T
    // test if T is subtype of T, U, V
    // should all work
    class D5<T extends U, U extends V, V> extends C3<T> {
        [x: string]: T;
        foo: T; // ok
    }
    
    class D6<T extends U, U extends V, V> extends C3<U> {
        [x: string]: U;
        foo: T;
    }
    
    class D7<T extends U, U extends V, V> extends C3<V> {
        [x: string]: V;
        foo: T; // ok
    }
    
    // test if U is a subtype of T, U, V
    // only a subtype of V and itself
    class D8<T extends U, U extends V, V> extends C3<T> {
          ~~
!!! error TS2415: Class 'D8<T, U, V>' incorrectly extends base class 'C3<T>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'U' is not assignable to type 'T'.
!!! error TS2415:       Type 'V' is not assignable to type 'T'.
        [x: string]: T;
        foo: U; // error
        ~~~~~~~
!!! error TS2411: Property 'foo' of type 'U' is not assignable to string index type 'T'.
    }
    
    class D9<T extends U, U extends V, V> extends C3<U> {
        [x: string]: U;
        foo: U; // ok
    }
    
    class D10<T extends U, U extends V, V> extends C3<V> {
        [x: string]: V;
        foo: U; // ok
    }
    
    // test if V is a subtype of T, U, V
    // only a subtype of itself
    class D11<T extends U, U extends V, V> extends C3<T> {
          ~~~
!!! error TS2415: Class 'D11<T, U, V>' incorrectly extends base class 'C3<T>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'V' is not assignable to type 'T'.
        [x: string]: T;
        foo: V; // error
        ~~~~~~~
!!! error TS2411: Property 'foo' of type 'V' is not assignable to string index type 'T'.
    }
    
    class D12<T extends U, U extends V, V> extends C3<U> {
          ~~~
!!! error TS2415: Class 'D12<T, U, V>' incorrectly extends base class 'C3<U>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'V' is not assignable to type 'U'.
        [x: string]: U;
        foo: V; // error
        ~~~~~~~
!!! error TS2411: Property 'foo' of type 'V' is not assignable to string index type 'U'.
    }
    
    class D13<T extends U, U extends V, V> extends C3<V> {
        [x: string]: V;
        foo: V; // ok
    }
    
    // Date > V > U > T
    // test if T is subtype of T, U, V, Date
    // should all work
    class D14<T extends U, U extends V, V extends Date> extends C3<Date> {
        [x: string]: Date;
        foo: T; // ok
    }
    
    class D15<T extends U, U extends V, V extends Date> extends C3<T> {
        [x: string]: T;
        foo: T; // ok
    }
    
    class D16<T extends U, U extends V, V extends Date> extends C3<U> {
        [x: string]: U;
        foo: T;
    }
    
    class D17<T extends U, U extends V, V extends Date> extends C3<V> {
        [x: string]: V;
        foo: T;
    }
    
    // test if U is a subtype of T, U, V, Date
    // only a subtype of V, Date and itself
    class D18<T extends U, U extends V, V extends Date> extends C3<Date> {
        [x: string]: Date;
        foo: T; // ok
    }
    
    class D19<T extends U, U extends V, V extends Date> extends C3<T> {
          ~~~
!!! error TS2415: Class 'D19<T, U, V>' incorrectly extends base class 'C3<T>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'U' is not assignable to type 'T'.
!!! error TS2415:       Type 'V' is not assignable to type 'T'.
!!! error TS2415:         Type 'Date' is not assignable to type 'T'.
        [x: string]: T;
        foo: U; // error
        ~~~~~~~
!!! error TS2411: Property 'foo' of type 'U' is not assignable to string index type 'T'.
    }
    
    class D20<T extends U, U extends V, V extends Date> extends C3<U> {
        [x: string]: U;
        foo: U; // ok
    }
    
    class D21<T extends U, U extends V, V extends Date> extends C3<V> {
        [x: string]: V;
        foo: U;
    }
    
    // test if V is a subtype of T, U, V, Date
    // only a subtype of itself and Date
    class D22<T extends U, U extends V, V extends Date> extends C3<Date> {
        [x: string]: Date;
        foo: T; // ok
    }
    
    class D23<T extends U, U extends V, V extends Date> extends C3<T> {
          ~~~
!!! error TS2415: Class 'D23<T, U, V>' incorrectly extends base class 'C3<T>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'V' is not assignable to type 'T'.
!!! error TS2415:       Type 'Date' is not assignable to type 'T'.
        [x: string]: T;
        foo: V; // error
        ~~~~~~~
!!! error TS2411: Property 'foo' of type 'V' is not assignable to string index type 'T'.
    }
    
    class D24<T extends U, U extends V, V extends Date> extends C3<U> {
          ~~~
!!! error TS2415: Class 'D24<T, U, V>' incorrectly extends base class 'C3<U>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'V' is not assignable to type 'U'.
!!! error TS2415:       Type 'Date' is not assignable to type 'U'.
        [x: string]: U;
        foo: V; // error
        ~~~~~~~
!!! error TS2411: Property 'foo' of type 'V' is not assignable to string index type 'U'.
    }
    
    class D25<T extends U, U extends V, V extends Date> extends C3<V> {
        [x: string]: V;
        foo: V; // ok
    }
    
    // test if Date is a subtype of T, U, V, Date
    // only a subtype of itself
    class D26<T extends U, U extends V, V extends Date> extends C3<Date> {
        [x: string]: Date;
        foo: Date; // ok
    }
    
    class D27<T extends U, U extends V, V extends Date> extends C3<T> {
          ~~~
!!! error TS2415: Class 'D27<T, U, V>' incorrectly extends base class 'C3<T>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'Date' is not assignable to type 'T'.
        [x: string]: T;
        foo: Date; // error
        ~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'Date' is not assignable to string index type 'T'.
    }
    
    class D28<T extends U, U extends V, V extends Date> extends C3<U> {
          ~~~
!!! error TS2415: Class 'D28<T, U, V>' incorrectly extends base class 'C3<U>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'Date' is not assignable to type 'U'.
        [x: string]: U;
        foo: Date; // error
        ~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'Date' is not assignable to string index type 'U'.
    }
    
    class D29<T extends U, U extends V, V extends Date> extends C3<V> {
          ~~~
!!! error TS2415: Class 'D29<T, U, V>' incorrectly extends base class 'C3<V>'.
!!! error TS2415:   Types of property 'foo' are incompatible.
!!! error TS2415:     Type 'Date' is not assignable to type 'V'.
        [x: string]: V;
        foo: Date; // error
        ~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'Date' is not assignable to string index type 'V'.
    }