=== tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.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 declare function foo1(a: new (x: T) => T[]); >foo1 : { (a: new (x: T) => T[]): any; (a: any): any; } >a : new (x: T) => T[] >T : T >x : T >T : T >T : T declare function foo1(a: any): any; >foo1 : { (a: new (x: T) => T[]): any; (a: any): any; } >a : any declare function foo2(a2: new (x: T) => string[]); >foo2 : { (a2: new (x: T) => string[]): any; (a: any): any; } >a2 : new (x: T) => string[] >T : T >x : T >T : T declare function foo2(a: any): any; >foo2 : { (a2: new (x: T) => string[]): any; (a: any): any; } >a : any declare function foo3(a3: new (x: T) => void); >foo3 : { (a3: new (x: T) => void): any; (a: any): any; } >a3 : new (x: T) => void >T : T >x : T >T : T declare function foo3(a: any): any; >foo3 : { (a3: new (x: T) => void): any; (a: any): any; } >a : any declare function foo4(a4: new (x: T, y: U) => string); >foo4 : { (a4: new (x: T, y: U) => string): any; (a: any): any; } >a4 : new (x: T, y: U) => string >T : T >U : U >x : T >T : T >y : U >U : U declare function foo4(a: any): any; >foo4 : { (a4: new (x: T, y: U) => string): any; (a: any): any; } >a : any declare function foo5(a5: new (x: new (arg: T) => U) => T); >foo5 : { (a5: new (x: new (arg: T) => U) => T): any; (a: any): any; } >a5 : new (x: new (arg: T) => U) => T >T : T >U : U >x : new (arg: T) => U >arg : T >T : T >U : U >T : T declare function foo5(a: any): any; >foo5 : { (a5: new (x: new (arg: T) => U) => T): any; (a: any): any; } >a : any declare function foo6(a6: new (x: new (arg: T) => Derived) => T); >foo6 : { (a6: new (x: new (arg: T) => Derived) => T): any; (a: any): any; } >a6 : new (x: new (arg: T) => Derived) => T >T : T >Base : Base >x : new (arg: T) => Derived >arg : T >T : T >Derived : Derived >T : T declare function foo6(a: any): any; >foo6 : { (a6: new (x: new (arg: T) => Derived) => T): any; (a: any): any; } >a : any declare function foo11(a11: new (x: { foo: T }, y: { foo: T; bar: T }) => Base); >foo11 : { (a11: new (x: { foo: T; }, y: { foo: T; bar: T; }) => Base): any; (a: any): any; } >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 declare function foo11(a: any): any; >foo11 : { (a11: new (x: { foo: T; }, y: { foo: T; bar: T; }) => Base): any; (a: any): any; } >a : any declare function foo15(a15: new (x: { a: T; b: T }) => T[]); >foo15 : { (a15: new (x: { a: T; b: T; }) => T[]): any; (a: any): any; } >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 declare function foo15(a: any): any; >foo15 : { (a15: new (x: { a: T; b: T; }) => T[]): any; (a: any): any; } >a : any declare function foo16(a16: new (x: { a: T; b: T }) => T[]); >foo16 : { (a16: new (x: { a: T; b: T; }) => T[]): any; (a: any): any; } >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 declare function foo16(a: any): any; >foo16 : { (a16: new (x: { a: T; b: T; }) => T[]): any; (a: any): any; } >a : any declare function foo17(a17: { >foo17 : { (a17: { new (x: new (a: T) => T): T[]; new (x: new (a: T) => T): T[]; }): any; (a: any): any; } >a17 : { new (x: new (a: T) => T): T[]; new (x: new (a: T) => T): T[]; } 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: T) => T): T[]; >T : T >Base : Base >x : new (a: T) => T >a : T >T : T >T : T >T : T }); declare function foo17(a: any): any; >foo17 : { (a17: { new (x: new (a: T) => T): T[]; new (x: new (a: T) => T): T[]; }): any; (a: any): any; } >a : any declare function foo18(a18: { >foo18 : { (a18: { new (x: { new (a: T): T; new (a: T): T; }): any[]; new (x: { new (a: T): T; new (a: T): T; }): any[]; }): any; (a: any): any; } >a18 : { new (x: { new (a: T): T; new (a: T): T; }): any[]; new (x: { new (a: T): T; new (a: T): T; }): any[]; } new (x: { >x : { new (a: T): T; new (a: T): T; } new (a: T): T; >T : T >Derived : Derived >a : T >T : T >T : T new (a: T): T; >T : T >Base : Base >a : T >T : T >T : T }): any[]; new (x: { >x : { new (a: T): T; new (a: T): T; } new (a: T): T; >T : T >Derived2 : Derived2 >a : T >T : T >T : T new (a: T): T; >T : T >Base : Base >a : T >T : T >T : T }): any[]; }); declare function foo18(a: any): any; >foo18 : { (a18: { new (x: { new (a: T): T; new (a: T): T; }): any[]; new (x: { new (a: T): T; new (a: T): T; }): any[]; }): any; (a: any): any; } >a : any var r1arg: new (x: T) => T[]; >r1arg : new (x: T) => T[] >T : T >x : T >T : T >T : T var r1arg2: new (x: T) => T[]; >r1arg2 : new (x: T) => T[] >T : T >x : T >T : T >T : T var r1 = foo1(r1arg); >r1 : any >foo1(r1arg) : any >foo1 : { (a: new (x: T) => T[]): any; (a: any): any; } >r1arg : new (x: T) => T[] var r1a = [r1arg, r1arg2]; >r1a : (new (x: T) => T[])[] >[r1arg, r1arg2] : (new (x: T) => T[])[] >r1arg : new (x: T) => T[] >r1arg2 : new (x: T) => T[] var r1b = [r1arg2, r1arg]; >r1b : (new (x: T) => T[])[] >[r1arg2, r1arg] : (new (x: T) => T[])[] >r1arg2 : new (x: T) => T[] >r1arg : new (x: T) => T[] var r2arg: new (x: T) => string[]; >r2arg : new (x: T) => string[] >T : T >x : T >T : T var r2arg2: new (x: T) => string[]; >r2arg2 : new (x: T) => string[] >T : T >x : T >T : T var r2 = foo2(r2arg); >r2 : any >foo2(r2arg) : any >foo2 : { (a2: new (x: T) => string[]): any; (a: any): any; } >r2arg : new (x: T) => string[] var r2a = [r2arg, r2arg2]; >r2a : (new (x: T) => string[])[] >[r2arg, r2arg2] : (new (x: T) => string[])[] >r2arg : new (x: T) => string[] >r2arg2 : new (x: T) => string[] var r2b = [r2arg2, r2arg]; >r2b : (new (x: T) => string[])[] >[r2arg2, r2arg] : (new (x: T) => string[])[] >r2arg2 : new (x: T) => string[] >r2arg : new (x: T) => string[] var r3arg: new (x: T) => T; >r3arg : new (x: T) => T >T : T >x : T >T : T >T : T var r3arg2: new (x: T) => void; >r3arg2 : new (x: T) => void >T : T >x : T >T : T var r3 = foo3(r3arg); >r3 : any >foo3(r3arg) : any >foo3 : { (a3: new (x: T) => void): any; (a: any): any; } >r3arg : new (x: T) => T var r3a = [r3arg, r3arg2]; >r3a : (new (x: T) => T)[] >[r3arg, r3arg2] : (new (x: T) => T)[] >r3arg : new (x: T) => T >r3arg2 : new (x: T) => void var r3b = [r3arg2, r3arg]; >r3b : (new (x: T) => T)[] >[r3arg2, r3arg] : (new (x: T) => T)[] >r3arg2 : new (x: T) => void >r3arg : new (x: T) => T var r4arg: new (x: T, y: U) => string; >r4arg : new (x: T, y: U) => string >T : T >U : U >x : T >T : T >y : U >U : U var r4arg2: new (x: T, y: U) => string; >r4arg2 : new (x: T, y: U) => string >T : T >U : U >x : T >T : T >y : U >U : U var r4 = foo4(r4arg); >r4 : any >foo4(r4arg) : any >foo4 : { (a4: new (x: T, y: U) => string): any; (a: any): any; } >r4arg : new (x: T, y: U) => string var r4a = [r4arg, r4arg2]; >r4a : (new (x: T, y: U) => string)[] >[r4arg, r4arg2] : (new (x: T, y: U) => string)[] >r4arg : new (x: T, y: U) => string >r4arg2 : new (x: T, y: U) => string var r4b = [r4arg2, r4arg]; >r4b : (new (x: T, y: U) => string)[] >[r4arg2, r4arg] : (new (x: T, y: U) => string)[] >r4arg2 : new (x: T, y: U) => string >r4arg : new (x: T, y: U) => string var r5arg: new (x: new (arg: T) => U) => T; >r5arg : new (x: new (arg: T) => U) => T >T : T >U : U >x : new (arg: T) => U >arg : T >T : T >U : U >T : T var r5arg2: new (x: new (arg: T) => U) => T; >r5arg2 : new (x: new (arg: T) => U) => T >T : T >U : U >x : new (arg: T) => U >arg : T >T : T >U : U >T : T var r5 = foo5(r5arg); >r5 : any >foo5(r5arg) : any >foo5 : { (a5: new (x: new (arg: T) => U) => T): any; (a: any): any; } >r5arg : new (x: new (arg: T) => U) => T var r5a = [r5arg, r5arg2]; >r5a : (new (x: new (arg: T) => U) => T)[] >[r5arg, r5arg2] : (new (x: new (arg: T) => U) => T)[] >r5arg : new (x: new (arg: T) => U) => T >r5arg2 : new (x: new (arg: T) => U) => T var r5b = [r5arg2, r5arg]; >r5b : (new (x: new (arg: T) => U) => T)[] >[r5arg2, r5arg] : (new (x: new (arg: T) => U) => T)[] >r5arg2 : new (x: new (arg: T) => U) => T >r5arg : new (x: new (arg: T) => U) => T var r6arg: new (x: new (arg: T) => U) => T; >r6arg : new (x: new (arg: T) => U) => T >T : T >Base : Base >U : U >Derived : Derived >x : new (arg: T) => U >arg : T >T : T >U : U >T : T var r6arg2: new (x: new (arg: T) => Derived) => T; >r6arg2 : new (x: new (arg: T) => Derived) => T >T : T >Base : Base >x : new (arg: T) => Derived >arg : T >T : T >Derived : Derived >T : T var r6 = foo6(r6arg); >r6 : any >foo6(r6arg) : any >foo6 : { (a6: new (x: new (arg: T) => Derived) => T): any; (a: any): any; } >r6arg : new (x: new (arg: T) => U) => T var r6a = [r6arg, r6arg2]; >r6a : (new (x: new (arg: T) => U) => T)[] >[r6arg, r6arg2] : (new (x: new (arg: T) => U) => T)[] >r6arg : new (x: new (arg: T) => U) => T >r6arg2 : new (x: new (arg: T) => Derived) => T var r6b = [r6arg2, r6arg]; >r6b : (new (x: new (arg: T) => U) => T)[] >[r6arg2, r6arg] : (new (x: new (arg: T) => U) => T)[] >r6arg2 : new (x: new (arg: T) => Derived) => T >r6arg : new (x: new (arg: T) => U) => T var r11arg: new (x: { foo: T }, y: { foo: U; bar: U }) => Base; >r11arg : 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 var r11arg2: new (x: { foo: T }, y: { foo: T; bar: T }) => Base; >r11arg2 : 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 var r11 = foo11(r11arg); >r11 : any >foo11(r11arg) : any >foo11 : { (a11: new (x: { foo: T; }, y: { foo: T; bar: T; }) => Base): any; (a: any): any; } >r11arg : new (x: { foo: T; }, y: { foo: U; bar: U; }) => Base var r11a = [r11arg, r11arg2]; >r11a : (new (x: { foo: T; }, y: { foo: U; bar: U; }) => Base)[] >[r11arg, r11arg2] : (new (x: { foo: T; }, y: { foo: U; bar: U; }) => Base)[] >r11arg : new (x: { foo: T; }, y: { foo: U; bar: U; }) => Base >r11arg2 : new (x: { foo: T; }, y: { foo: T; bar: T; }) => Base var r11b = [r11arg2, r11arg]; >r11b : (new (x: { foo: T; }, y: { foo: U; bar: U; }) => Base)[] >[r11arg2, r11arg] : (new (x: { foo: T; }, y: { foo: U; bar: U; }) => Base)[] >r11arg2 : new (x: { foo: T; }, y: { foo: T; bar: T; }) => Base >r11arg : new (x: { foo: T; }, y: { foo: U; bar: U; }) => Base var r15arg: new (x: { a: U; b: V; }) => U[]; >r15arg : 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 var r15arg2: new (x: { a: T; b: T }) => T[]; >r15arg2 : new (x: { a: T; b: T; }) => T[] >T : T >x : { a: T; b: T; } >a : T >T : T >b : T >T : T >T : T var r15 = foo15(r15arg); >r15 : any >foo15(r15arg) : any >foo15 : { (a15: new (x: { a: T; b: T; }) => T[]): any; (a: any): any; } >r15arg : new (x: { a: U; b: V; }) => U[] var r15a = [r15arg, r15arg2]; >r15a : (new (x: { a: U; b: V; }) => U[])[] >[r15arg, r15arg2] : (new (x: { a: U; b: V; }) => U[])[] >r15arg : new (x: { a: U; b: V; }) => U[] >r15arg2 : new (x: { a: T; b: T; }) => T[] var r15b = [r15arg2, r15arg]; >r15b : (new (x: { a: U; b: V; }) => U[])[] >[r15arg2, r15arg] : (new (x: { a: U; b: V; }) => U[])[] >r15arg2 : new (x: { a: T; b: T; }) => T[] >r15arg : new (x: { a: U; b: V; }) => U[] var r16arg: new (x: { a: T; b: T }) => T[]; >r16arg : 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 var r16arg2: new (x: { a: T; b: T }) => T[]; >r16arg2 : 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 var r16 = foo16(r16arg); >r16 : any >foo16(r16arg) : any >foo16 : { (a16: new (x: { a: T; b: T; }) => T[]): any; (a: any): any; } >r16arg : new (x: { a: T; b: T; }) => T[] var r16a = [r16arg, r16arg2]; >r16a : (new (x: { a: T; b: T; }) => T[])[] >[r16arg, r16arg2] : (new (x: { a: T; b: T; }) => T[])[] >r16arg : new (x: { a: T; b: T; }) => T[] >r16arg2 : new (x: { a: T; b: T; }) => T[] var r16b = [r16arg2, r16arg]; >r16b : (new (x: { a: T; b: T; }) => T[])[] >[r16arg2, r16arg] : (new (x: { a: T; b: T; }) => T[])[] >r16arg2 : new (x: { a: T; b: T; }) => T[] >r16arg : new (x: { a: T; b: T; }) => T[] var r17arg: new (x: new (a: T) => T) => T[]; >r17arg : new (x: new (a: T) => T) => T[] >T : T >x : new (a: T) => T >a : T >T : T >T : T >T : T var r17 = foo17(r17arg); >r17 : any >foo17(r17arg) : any >foo17 : { (a17: { new (x: new (a: T) => T): T[]; new (x: new (a: T) => T): T[]; }): any; (a: any): any; } >r17arg : new (x: new (a: T) => T) => T[] var r18arg: new (x: new (a: T) => T) => any[]; >r18arg : new (x: new (a: T) => T) => any[] >x : new (a: T) => T >T : T >a : T >T : T >T : T var r18 = foo18(r18arg); >r18 : any >foo18(r18arg) : any >foo18 : { (a18: { new (x: { new (a: T): T; new (a: T): T; }): any[]; new (x: { new (a: T): T; new (a: T): T; }): any[]; }): any; (a: any): any; } >r18arg : new (x: new (a: T) => T) => any[]