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