=== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts === // checking subtype relations for function types as it relates to contextual signature instantiation class Base { foo: string; } >Base : Base >foo : string class Derived extends Base { bar: string; } >Derived : Derived >Base : Base >bar : string class Derived2 extends Derived { baz: string; } >Derived2 : Derived2 >Derived : Derived >baz : string class OtherDerived extends Base { bing: string; } >OtherDerived : OtherDerived >Base : Base >bing : string interface A { // T >A : A // M's a: new (x: T) => T[]; >a : new (x: T) => T[] >T : T >x : T >T : T >T : T a2: new (x: T) => string[]; >a2 : new (x: T) => string[] >T : T >x : T >T : T a3: new (x: T) => void; >a3 : new (x: T) => void >T : T >x : T >T : T a4: new (x: T, y: U) => string; >a4 : new (x: T, y: U) => string >T : T >U : U >x : T >T : T >y : U >U : U a5: new (x: (arg: T) => U) => T; >a5 : new (x: (arg: T) => U) => T >T : T >U : U >x : (arg: T) => U >arg : T >T : T >U : U >T : T a6: new (x: (arg: T) => Derived) => T; >a6 : new (x: (arg: T) => Derived) => T >T : T >Base : Base >x : (arg: T) => Derived >arg : T >T : T >Derived : Derived >T : T a11: new (x: { foo: T }, y: { foo: T; bar: T }) => Base; >a11 : new (x: { foo: T; }, y: { foo: T; bar: T; }) => Base >T : T >x : { foo: T; } >foo : T >T : T >y : { foo: T; bar: T; } >foo : T >T : T >bar : T >T : T >Base : Base a15: new (x: { a: T; b: T }) => T[]; >a15 : new (x: { a: T; b: T; }) => T[] >T : T >x : { a: T; b: T; } >a : T >T : T >b : T >T : T >T : T a16: new (x: { a: T; b: T }) => T[]; >a16 : new (x: { a: T; b: T; }) => T[] >T : T >Base : Base >x : { a: T; b: T; } >a : T >T : T >b : T >T : T >T : T a17: { >a17 : { new (x: T): T[]; new (x: U): U[]; } new (x: T): T[]; >T : T >Base : Base >x : T >T : T >T : T new (x: U): U[]; >U : U >Derived : Derived >x : U >U : U >U : U }; a18: { >a18 : { new (x: T): number[]; new (x: U): number[]; } new (x: T): number[]; >T : T >Derived : Derived >x : T >T : T new (x: U): number[]; >U : U >Base : Base >x : U >U : U }; a19: { >a19 : { new (x: new (a: T) => T): T[]; new (x: new (a: U) => U): U[]; } new (x: new (a: T) => T): T[]; >T : T >Derived : Derived >x : new (a: T) => T >a : T >T : T >T : T >T : T new (x: new (a: U) => U): U[]; >U : U >Base : Base >x : new (a: U) => U >a : U >U : U >U : U >U : U }; a20: { >a20 : { new (x: { new (a: T): T; new (a: U): U; }): any[]; new (x: { new (a: T): T; new (a: U): U; }): any[]; } new (x: { >x : { new (a: T): T; new (a: U): U; } new (a: T): T; >T : T >Derived : Derived >a : T >T : T >T : T new (a: U): U; >U : U >Base : Base >a : U >U : U >U : U }): any[]; new (x: { >x : { new (a: T): T; new (a: U): U; } new (a: T): T; >T : T >Base : Base >a : T >T : T >T : T new (a: U): U; >U : U >Derived2 : Derived2 >a : U >U : U >U : U }): any[]; }; } // S's interface I extends A { >I : I >A : A // N's a: new (x: T) => T[]; // ok, instantiation of N is a subtype of M, T is number >a : new (x: T) => T[] >T : T >x : T >T : T >T : T a2: new (x: T) => string[]; // ok >a2 : new (x: T) => string[] >T : T >x : T >T : T a3: new (x: T) => T; // ok since Base returns void >a3 : new (x: T) => T >T : T >x : T >T : T >T : T a4: new (x: T, y: U) => string; // ok, instantiation of N is a subtype of M, T is string, U is number >a4 : new (x: T, y: U) => string >T : T >U : U >x : T >T : T >y : U >U : U a5: new (x: (arg: T) => U) => T; // ok, U is in a parameter position so inferences can be made >a5 : new (x: (arg: T) => U) => T >T : T >U : U >x : (arg: T) => U >arg : T >T : T >U : U >T : T a6: new (x: (arg: T) => U) => T; // ok, same as a5 but with object type hierarchy >a6 : new (x: (arg: T) => U) => T >T : T >Base : Base >U : U >Derived : Derived >x : (arg: T) => U >arg : T >T : T >U : U >T : T a11: new (x: { foo: T }, y: { foo: U; bar: U }) => Base; // ok >a11 : new (x: { foo: T; }, y: { foo: U; bar: U; }) => Base >T : T >U : U >x : { foo: T; } >foo : T >T : T >y : { foo: U; bar: U; } >foo : U >U : U >bar : U >U : U >Base : Base a15: new (x: { a: U; b: V; }) => U[]; // ok, T = U, T = V >a15 : new (x: { a: U; b: V; }) => U[] >U : U >V : V >x : { a: U; b: V; } >a : U >U : U >b : V >V : V >U : U a16: new (x: { a: T; b: T }) => T[]; // ok, more general parameter type >a16 : new (x: { a: T; b: T; }) => T[] >T : T >x : { a: T; b: T; } >a : T >T : T >b : T >T : T >T : T a17: new (x: T) => T[]; // ok, more general parameter type >a17 : new (x: T) => T[] >T : T >Base : Base >x : T >T : T >T : T a18: new (x: T) => number[]; // ok, more general parameter type >a18 : new (x: T) => number[] >T : T >Base : Base >x : T >T : T a19: new (x: new (a: T) => T) => T[]; // ok >a19 : new (x: new (a: T) => T) => T[] >T : T >Base : Base >x : new (a: T) => T >a : T >T : T >T : T >T : T a20: new (x: new (a: T) => T) => any[]; // ok >a20 : new (x: new (a: T) => T) => any[] >x : new (a: T) => T >T : T >Base : Base >a : T >T : T >T : T }