=== tests/cases/compiler/genericCallbacksAndClassHierarchy.ts === module M { >M : typeof M export interface I { >I : I >T : T subscribe(callback: (newValue: T) => void ): any; >subscribe : (callback: (newValue: T) => void) => any >callback : (newValue: T) => void >newValue : T >T : T } export class C1 { >C1 : C1 >T : T public value: I; >value : I >I : I >T : T } export class A { >A : A >T : T public dummy: any; >dummy : any } export class B extends C1> { } >B : B >T : T >C1 : C1 >A : A >T : T export class D { >D : D >T : T _subscribe(viewModel: B): void { >_subscribe : (viewModel: B) => void >viewModel : B >B : B >T : T var f = (newValue: A) => { }; >f : (newValue: A) => void >(newValue: A) => { } : (newValue: A) => void >newValue : A >A : A >T : T var v: I> = viewModel.value; >v : I> >I : I >A : A >T : T >viewModel.value : I> >viewModel : B >value : I> // both of these should work v.subscribe(f); >v.subscribe(f) : any >v.subscribe : (callback: (newValue: A) => void) => any >v : I> >subscribe : (callback: (newValue: A) => void) => any >f : (newValue: A) => void v.subscribe((newValue: A) => { }); >v.subscribe((newValue: A) => { }) : any >v.subscribe : (callback: (newValue: A) => void) => any >v : I> >subscribe : (callback: (newValue: A) => void) => any >(newValue: A) => { } : (newValue: A) => void >newValue : A >A : A >T : T } } }