=== tests/cases/compiler/genericClassPropertyInheritanceSpecialization.ts === interface KnockoutObservableBase { >KnockoutObservableBase : KnockoutObservableBase >T : T peek(): T; >peek : () => T >T : T (): T; >T : T (value: T): void; >value : T >T : T } interface KnockoutObservable extends KnockoutObservableBase { >KnockoutObservable : KnockoutObservable >T : T >KnockoutObservableBase : KnockoutObservableBase >T : T equalityComparer(a: T, b: T): boolean; >equalityComparer : (a: T, b: T) => boolean >a : T >T : T >b : T >T : T valueHasMutated(): void; >valueHasMutated : () => void valueWillMutate(): void; >valueWillMutate : () => void } interface KnockoutObservableArray extends KnockoutObservable { >KnockoutObservableArray : KnockoutObservableArray >T : T >KnockoutObservable : KnockoutObservable >T : T indexOf(searchElement: T, fromIndex?: number): number; >indexOf : (searchElement: T, fromIndex?: number) => number >searchElement : T >T : T >fromIndex : number slice(start: number, end?: number): T[]; >slice : (start: number, end?: number) => T[] >start : number >end : number >T : T splice(start: number, deleteCount?: number, ...items: T[]): T[]; >splice : (start: number, deleteCount?: number, ...items: T[]) => T[] >start : number >deleteCount : number >items : T[] >T : T >T : T pop(): T; >pop : () => T >T : T push(...items: T[]): void; >push : (...items: T[]) => void >items : T[] >T : T shift(): T; >shift : () => T >T : T unshift(...items: T[]): number; >unshift : (...items: T[]) => number >items : T[] >T : T reverse(): T[]; >reverse : () => T[] >T : T sort(compareFunction?: (a: T, b: T) => number): void; >sort : (compareFunction?: (a: T, b: T) => number) => void >compareFunction : (a: T, b: T) => number >a : T >T : T >b : T >T : T replace(oldItem: T, newItem: T): void; >replace : (oldItem: T, newItem: T) => void >oldItem : T >T : T >newItem : T >T : T remove(item: T): T[]; >remove : (item: T) => T[] >item : T >T : T >T : T removeAll(items?: T[]): T[]; >removeAll : (items?: T[]) => T[] >items : T[] >T : T >T : T destroy(item: T): void; >destroy : (item: T) => void >item : T >T : T destroyAll(items?: T[]): void; >destroyAll : (items?: T[]) => void >items : T[] >T : T } interface KnockoutObservableArrayStatic { >KnockoutObservableArrayStatic : KnockoutObservableArrayStatic fn: KnockoutObservableArray; >fn : KnockoutObservableArray >KnockoutObservableArray : KnockoutObservableArray (value?: T[]): KnockoutObservableArray; >T : T >value : T[] >T : T >KnockoutObservableArray : KnockoutObservableArray >T : T } declare module ko { >ko : typeof ko export var observableArray: KnockoutObservableArrayStatic; >observableArray : KnockoutObservableArrayStatic >KnockoutObservableArrayStatic : KnockoutObservableArrayStatic } module Portal.Controls.Validators { >Portal : typeof Portal >Controls : typeof Controls >Validators : typeof Validators export class Validator { >Validator : Validator >TValue : TValue private _subscription; >_subscription : any public message: KnockoutObservable; >message : KnockoutObservable >KnockoutObservable : KnockoutObservable public validationState: KnockoutObservable; >validationState : KnockoutObservable >KnockoutObservable : KnockoutObservable public validate: KnockoutObservable; >validate : KnockoutObservable >KnockoutObservable : KnockoutObservable >TValue : TValue constructor(message?: string) { } >message : string public destroy(): void { } >destroy : () => void public _validate(value: TValue): number {return 0 } >_validate : (value: TValue) => number >value : TValue >TValue : TValue } } module PortalFx.ViewModels.Controls.Validators { >PortalFx : typeof PortalFx >ViewModels : typeof ViewModels >Controls : typeof Controls >Validators : typeof Validators export class Validator extends Portal.Controls.Validators.Validator { >Validator : Validator >TValue : TValue >Portal : unknown >Controls : unknown >Validators : unknown >Validator : Portal.Controls.Validators.Validator >TValue : TValue constructor(message?: string) { >message : string super(message); >super(message) : void >super : typeof Portal.Controls.Validators.Validator >message : string } } } interface Contract { >Contract : Contract >TValue : TValue validators: KnockoutObservableArray>; >validators : KnockoutObservableArray> >KnockoutObservableArray : KnockoutObservableArray >PortalFx : unknown >ViewModels : unknown >Controls : unknown >Validators : unknown >Validator : PortalFx.ViewModels.Controls.Validators.Validator >TValue : TValue } class ViewModel implements Contract { >ViewModel : ViewModel >TValue : TValue >Contract : Contract >TValue : TValue public validators: KnockoutObservableArray> = ko.observableArray>(); >validators : KnockoutObservableArray> >KnockoutObservableArray : KnockoutObservableArray >PortalFx : unknown >ViewModels : unknown >Controls : unknown >Validators : unknown >Validator : PortalFx.ViewModels.Controls.Validators.Validator >TValue : TValue >ko.observableArray>() : KnockoutObservableArray> >ko.observableArray : KnockoutObservableArrayStatic >ko : typeof ko >observableArray : KnockoutObservableArrayStatic >PortalFx : unknown >ViewModels : unknown >Controls : unknown >Validators : unknown >Validator : PortalFx.ViewModels.Controls.Validators.Validator >TValue : TValue }