=== tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts === // satisfaction of a constraint to Function, no errors expected function foo string>(x: T): T { return x; } >foo : string>(x: T) => T >T : T >x : string >x : T >T : T >T : T >x : T interface I { >I : I (): string; } var i: I; >i : I >I : I class C { >C : C foo: string; >foo : string } var a: { (): string }; >a : () => string var b: { new (): string }; >b : new () => string var c: { (): string; (x): string }; >c : { (): string; (x: any): string; } >x : any var r1 = foo((x) => x); >r1 : (x: any) => any >foo((x) => x) : (x: any) => any >foo : string>(x: T) => T >(x) => x : (x: any) => any >x : any >x : any var r2 = foo((x: string) => x); >r2 : (x: string) => string >foo((x: string) => x) : (x: string) => string >foo : string>(x: T) => T >(x: string) => x : (x: string) => string >x : string >x : string var r3 = foo(function (x) { return x }); >r3 : (x: any) => any >foo(function (x) { return x }) : (x: any) => any >foo : string>(x: T) => T >function (x) { return x } : (x: any) => any >x : any >x : any var r4 = foo(function (x: string) { return x }); >r4 : (x: string) => string >foo(function (x: string) { return x }) : (x: string) => string >foo : string>(x: T) => T >function (x: string) { return x } : (x: string) => string >x : string >x : string var r5 = foo(i); >r5 : I >foo(i) : I >foo : string>(x: T) => T >i : I var r8 = foo(c); >r8 : { (): string; (x: any): string; } >foo(c) : { (): string; (x: any): string; } >foo : string>(x: T) => T >c : { (): string; (x: any): string; } interface I2 { >I2 : I2 >T : T (x: T): T; >x : T >T : T >T : T } var i2: I2; >i2 : I2 >I2 : I2 class C2 { >C2 : C2 >T : T foo: T; >foo : T >T : T } var a2: { (x: T): T }; >a2 : (x: T) => T >T : T >x : T >T : T >T : T var b2: { new (x: T): T }; >b2 : new (x: T) => T >T : T >x : T >T : T >T : T var c2: { (x: T): T; (x: T, y: T): T }; >c2 : { (x: T): T; (x: T, y: T): T; } >T : T >x : T >T : T >T : T >T : T >x : T >T : T >y : T >T : T >T : T var r9 = foo(function (x: U) { return x; }); >r9 : (x: U) => U >foo(function (x: U) { return x; }) : (x: U) => U >foo : string>(x: T) => T >function (x: U) { return x; } : (x: U) => U >U : U >x : U >U : U >x : U var r10 = foo((x: U) => x); >r10 : (x: U) => U >foo((x: U) => x) : (x: U) => U >foo : string>(x: T) => T >(x: U) => x : (x: U) => U >U : U >x : U >U : U >x : U var r12 = foo(i2); >r12 : I2 >foo(i2) : I2 >foo : string>(x: T) => T >i2 : I2 var r15 = foo(c2); >r15 : { (x: T): T; (x: T, y: T): T; } >foo(c2) : { (x: T): T; (x: T, y: T): T; } >foo : string>(x: T) => T >c2 : { (x: T): T; (x: T, y: T): T; }