=== tests/cases/conformance/expressions/contextualTyping/taggedTemplateContextualTyping2.ts === type FuncType1 = (x: (p: T) => T) => typeof x; >FuncType1 : (x: (p: T) => T) => (p: T) => T >x : (p: T) => T >T : T >p : T >T : T >T : T >x : (p: T) => T type FuncType2 = (x: (p: T) => T) => typeof x; >FuncType2 : (x: (p: T) => T) => (p: T) => T >x : (p: T) => T >S : S >T : T >p : T >T : T >T : T >x : (p: T) => T function tempTag2(templateStrs: TemplateStringsArray, f: FuncType1, x: number): number; >tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, h: (x: (p: T) => T) => (p: T) => T, x: string): string; } >templateStrs : TemplateStringsArray >TemplateStringsArray : TemplateStringsArray >f : (x: (p: T) => T) => (p: T) => T >FuncType1 : (x: (p: T) => T) => (p: T) => T >x : number function tempTag2(templateStrs: TemplateStringsArray, f: FuncType2, h: FuncType2, x: string): string; >tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, h: (x: (p: T) => T) => (p: T) => T, x: string): string; } >templateStrs : TemplateStringsArray >TemplateStringsArray : TemplateStringsArray >f : (x: (p: T) => T) => (p: T) => T >FuncType2 : (x: (p: T) => T) => (p: T) => T >h : (x: (p: T) => T) => (p: T) => T >FuncType2 : (x: (p: T) => T) => (p: T) => T >x : string function tempTag2(...rest: any[]): any { >tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, h: (x: (p: T) => T) => (p: T) => T, x: string): string; } >rest : any[] return undefined; >undefined : undefined } // If contextual typing takes place, these functions should work. // Otherwise, the arrow functions' parameters will be typed as 'any', // and it is an error to invoke an any-typed value with type arguments, // so this test will error. tempTag2 `${ x => { x(undefined); return x; } }${ 0 }`; >tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, h: (x: (p: T) => T) => (p: T) => T, x: string): string; } >x => { x(undefined); return x; } : (x: (p: T) => T) => (p: T) => T >x : (p: T) => T >x(undefined) : number >x : (p: T) => T >undefined : undefined >x : (p: T) => T tempTag2 `${ x => { x(undefined); return x; } }${ y => { y(null); return y; } }${ "hello" }`; >tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, h: (x: (p: T) => T) => (p: T) => T, x: string): string; } >x => { x(undefined); return x; } : (x: (p: T) => T) => (p: T) => T >x : (p: T) => T >x(undefined) : string >x : (p: T) => T >undefined : undefined >x : (p: T) => T >y => { y(null); return y; } : (y: (p: T) => T) => (p: T) => T >y : (p: T) => T >y(null) : number >y : (p: T) => T >y : (p: T) => T tempTag2 `${ x => { x(undefined); return x; } }${ undefined }${ "hello" }`; >tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: (p: T) => T) => (p: T) => T, h: (x: (p: T) => T) => (p: T) => T, x: string): string; } >x => { x(undefined); return x; } : (x: (p: T) => T) => (p: T) => T >x : (p: T) => T >x(undefined) : string >x : (p: T) => T >undefined : undefined >x : (p: T) => T >undefined : undefined