=== tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts === class C { >C : C >T : T f() { >f : () => string var x: T; >x : T >T : T var a = x['toString'](); // should be string >a : string >x['toString']() : string >x['toString'] : () => string >x : T return a + x.toString(); >a + x.toString() : string >a : string >x.toString() : string >x.toString : () => string >x : T >toString : () => string } } var r = (new C()).f(); >r : string >(new C()).f() : string >(new C()).f : () => string >(new C()) : C >new C() : C >C : typeof C >f : () => string interface I { >I : I >T : T foo: T; >foo : T >T : T } var i: I; >i : I >I : I var r2 = i.foo.toString(); >r2 : string >i.foo.toString() : string >i.foo.toString : (radix?: number) => string >i.foo : number >i : I >foo : number >toString : (radix?: number) => string var r2b = i.foo['toString'](); >r2b : string >i.foo['toString']() : string >i.foo['toString'] : (radix?: number) => string >i.foo : number >i : I >foo : number var a: { >a : () => T (): T; >T : T >T : T } var r3: string = a().toString(); >r3 : string >a().toString() : string >a().toString : () => string >a() : {} >a : () => T >toString : () => string var r3b: string = a()['toString'](); >r3b : string >a()['toString']() : string >a()['toString'] : () => string >a() : {} >a : () => T var b = { >b : { foo: (x: T) => string; } >{ foo: (x: T) => { var a = x['toString'](); // should be string return a + x.toString(); } } : { foo: (x: T) => string; } foo: (x: T) => { >foo : (x: T) => string >(x: T) => { var a = x['toString'](); // should be string return a + x.toString(); } : (x: T) => string >T : T >x : T >T : T var a = x['toString'](); // should be string >a : string >x['toString']() : string >x['toString'] : () => string >x : T return a + x.toString(); >a + x.toString() : string >a : string >x.toString() : string >x.toString : () => string >x : T >toString : () => string } } var r4 = b.foo(1); >r4 : string >b.foo(1) : string >b.foo : (x: T) => string >b : { foo: (x: T) => string; } >foo : (x: T) => string