subtypesOfTypeParameterWithConstraints.ts(4,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(9,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(14,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(19,5): error TS2411: Property 'foo' of type 'U' is not assignable to 'string' index type 'T'.
subtypesOfTypeParameterWithConstraints.ts(19,5): error TS2416: Property 'foo' in type 'D3<T, U>' is not assignable to the same property in base type 'C3<T>'.
  Type 'U' is not assignable to type 'T'.
    'T' could be instantiated with an arbitrary type which could be unrelated to 'U'.
subtypesOfTypeParameterWithConstraints.ts(19,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(24,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(33,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(38,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(43,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(50,5): error TS2411: Property 'foo' of type 'U' is not assignable to 'string' index type 'T'.
subtypesOfTypeParameterWithConstraints.ts(50,5): error TS2416: Property 'foo' in type 'D8<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
  Type 'U' is not assignable to type 'T'.
    'T' could be instantiated with an arbitrary type which could be unrelated to 'U'.
subtypesOfTypeParameterWithConstraints.ts(50,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(55,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(60,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(67,5): error TS2411: Property 'foo' of type 'V' is not assignable to 'string' index type 'T'.
subtypesOfTypeParameterWithConstraints.ts(67,5): error TS2416: Property 'foo' in type 'D11<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
  Type 'V' is not assignable to type 'T'.
    'T' could be instantiated with an arbitrary type which could be unrelated to 'V'.
subtypesOfTypeParameterWithConstraints.ts(67,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(72,5): error TS2411: Property 'foo' of type 'V' is not assignable to 'string' index type 'U'.
subtypesOfTypeParameterWithConstraints.ts(72,5): error TS2416: Property 'foo' in type 'D12<T, U, V>' is not assignable to the same property in base type 'C3<U>'.
  Type 'V' is not assignable to type 'U'.
    'U' could be instantiated with an arbitrary type which could be unrelated to 'V'.
subtypesOfTypeParameterWithConstraints.ts(72,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(77,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(85,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(90,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(95,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(100,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(107,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(112,5): error TS2411: Property 'foo' of type 'U' is not assignable to 'string' index type 'T'.
subtypesOfTypeParameterWithConstraints.ts(112,5): error TS2416: Property 'foo' in type 'D19<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
  Type 'U' is not assignable to type 'T'.
    'U' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Date'.
subtypesOfTypeParameterWithConstraints.ts(112,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(117,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(122,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(129,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(134,5): error TS2411: Property 'foo' of type 'V' is not assignable to 'string' index type 'T'.
subtypesOfTypeParameterWithConstraints.ts(134,5): error TS2416: Property 'foo' in type 'D23<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
  Type 'V' is not assignable to type 'T'.
    'V' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Date'.
subtypesOfTypeParameterWithConstraints.ts(134,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(139,5): error TS2411: Property 'foo' of type 'V' is not assignable to 'string' index type 'U'.
subtypesOfTypeParameterWithConstraints.ts(139,5): error TS2416: Property 'foo' in type 'D24<T, U, V>' is not assignable to the same property in base type 'C3<U>'.
  Type 'V' is not assignable to type 'U'.
    'V' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'Date'.
subtypesOfTypeParameterWithConstraints.ts(139,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(144,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(151,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(156,5): error TS2411: Property 'foo' of type 'Date' is not assignable to 'string' index type 'T'.
subtypesOfTypeParameterWithConstraints.ts(156,5): error TS2416: Property 'foo' in type 'D27<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
  Type 'Date' is not assignable to type 'T'.
    'Date' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Date'.
subtypesOfTypeParameterWithConstraints.ts(156,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(161,5): error TS2411: Property 'foo' of type 'Date' is not assignable to 'string' index type 'U'.
subtypesOfTypeParameterWithConstraints.ts(161,5): error TS2416: Property 'foo' in type 'D28<T, U, V>' is not assignable to the same property in base type 'C3<U>'.
  Type 'Date' is not assignable to type 'U'.
    'Date' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'Date'.
subtypesOfTypeParameterWithConstraints.ts(161,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
subtypesOfTypeParameterWithConstraints.ts(166,5): error TS2411: Property 'foo' of type 'Date' is not assignable to 'string' index type 'V'.
subtypesOfTypeParameterWithConstraints.ts(166,5): error TS2416: Property 'foo' in type 'D29<T, U, V>' is not assignable to the same property in base type 'C3<V>'.
  Type 'Date' is not assignable to type 'V'.
    'Date' is assignable to the constraint of type 'V', but 'V' could be instantiated with a different subtype of constraint 'Date'.
subtypesOfTypeParameterWithConstraints.ts(166,5): error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.


==== subtypesOfTypeParameterWithConstraints.ts (50 errors) ====
    // checking whether other types are subtypes of type parameters with constraints
    
    class C3<T> {
        foo: T;
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D1<T extends U, U> extends C3<T> {
        [x: string]: T;
        foo: T; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D2<T extends U, U> extends C3<U> {
        [x: string]: U;
        foo: T; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D3<T extends U, U> extends C3<T> {
        [x: string]: T;
        foo: U; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'U' is not assignable to 'string' index type 'T'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D3<T, U>' is not assignable to the same property in base type 'C3<T>'.
!!! error TS2416:   Type 'U' is not assignable to type 'T'.
!!! error TS2416:     'T' could be instantiated with an arbitrary type which could be unrelated to 'U'.
!!! related TS2208 subtypesOfTypeParameterWithConstraints.ts:17:23: This type parameter might need an `extends T` constraint.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D4<T extends U, U> extends C3<U> {
        [x: string]: U;
        foo: U; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    
    // 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
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D6<T extends U, U extends V, V> extends C3<U> {
        [x: string]: U;
        foo: T;
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D7<T extends U, U extends V, V> extends C3<V> {
        [x: string]: V;
        foo: T; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    // 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> {
        [x: string]: T;
        foo: U; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'U' is not assignable to 'string' index type 'T'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D8<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
!!! error TS2416:   Type 'U' is not assignable to type 'T'.
!!! error TS2416:     'T' could be instantiated with an arbitrary type which could be unrelated to 'U'.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D9<T extends U, U extends V, V> extends C3<U> {
        [x: string]: U;
        foo: U; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D10<T extends U, U extends V, V> extends C3<V> {
        [x: string]: V;
        foo: U; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    // 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> {
        [x: string]: T;
        foo: V; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'V' is not assignable to 'string' index type 'T'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D11<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
!!! error TS2416:   Type 'V' is not assignable to type 'T'.
!!! error TS2416:     'T' could be instantiated with an arbitrary type which could be unrelated to 'V'.
!!! related TS2208 subtypesOfTypeParameterWithConstraints.ts:65:37: This type parameter might need an `extends T` constraint.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D12<T extends U, U extends V, V> extends C3<U> {
        [x: string]: U;
        foo: V; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'V' is not assignable to 'string' index type 'U'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D12<T, U, V>' is not assignable to the same property in base type 'C3<U>'.
!!! error TS2416:   Type 'V' is not assignable to type 'U'.
!!! error TS2416:     'U' could be instantiated with an arbitrary type which could be unrelated to 'V'.
!!! related TS2208 subtypesOfTypeParameterWithConstraints.ts:70:37: This type parameter might need an `extends U` constraint.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D13<T extends U, U extends V, V> extends C3<V> {
        [x: string]: V;
        foo: V; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    // 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
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D15<T extends U, U extends V, V extends Date> extends C3<T> {
        [x: string]: T;
        foo: T; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D16<T extends U, U extends V, V extends Date> extends C3<U> {
        [x: string]: U;
        foo: T;
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D17<T extends U, U extends V, V extends Date> extends C3<V> {
        [x: string]: V;
        foo: T;
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    // 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
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D19<T extends U, U extends V, V extends Date> extends C3<T> {
        [x: string]: T;
        foo: U; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'U' is not assignable to 'string' index type 'T'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D19<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
!!! error TS2416:   Type 'U' is not assignable to type 'T'.
!!! error TS2416:     'U' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Date'.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D20<T extends U, U extends V, V extends Date> extends C3<U> {
        [x: string]: U;
        foo: U; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D21<T extends U, U extends V, V extends Date> extends C3<V> {
        [x: string]: V;
        foo: U;
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    // 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
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D23<T extends U, U extends V, V extends Date> extends C3<T> {
        [x: string]: T;
        foo: V; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'V' is not assignable to 'string' index type 'T'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D23<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
!!! error TS2416:   Type 'V' is not assignable to type 'T'.
!!! error TS2416:     'V' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Date'.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D24<T extends U, U extends V, V extends Date> extends C3<U> {
        [x: string]: U;
        foo: V; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'V' is not assignable to 'string' index type 'U'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D24<T, U, V>' is not assignable to the same property in base type 'C3<U>'.
!!! error TS2416:   Type 'V' is not assignable to type 'U'.
!!! error TS2416:     'V' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'Date'.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D25<T extends U, U extends V, V extends Date> extends C3<V> {
        [x: string]: V;
        foo: V; // ok
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    // 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
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D27<T extends U, U extends V, V extends Date> extends C3<T> {
        [x: string]: T;
        foo: Date; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'Date' is not assignable to 'string' index type 'T'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D27<T, U, V>' is not assignable to the same property in base type 'C3<T>'.
!!! error TS2416:   Type 'Date' is not assignable to type 'T'.
!!! error TS2416:     'Date' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Date'.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D28<T extends U, U extends V, V extends Date> extends C3<U> {
        [x: string]: U;
        foo: Date; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'Date' is not assignable to 'string' index type 'U'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D28<T, U, V>' is not assignable to the same property in base type 'C3<U>'.
!!! error TS2416:   Type 'Date' is not assignable to type 'U'.
!!! error TS2416:     'Date' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'Date'.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }
    
    class D29<T extends U, U extends V, V extends Date> extends C3<V> {
        [x: string]: V;
        foo: Date; // error
        ~~~
!!! error TS2411: Property 'foo' of type 'Date' is not assignable to 'string' index type 'V'.
        ~~~
!!! error TS2416: Property 'foo' in type 'D29<T, U, V>' is not assignable to the same property in base type 'C3<V>'.
!!! error TS2416:   Type 'Date' is not assignable to type 'V'.
!!! error TS2416:     'Date' is assignable to the constraint of type 'V', but 'V' could be instantiated with a different subtype of constraint 'Date'.
        ~~~
!!! error TS2564: Property 'foo' has no initializer and is not definitely assigned in the constructor.
    }