interface Pet { p : string ; } interface Dog extends Pet { d : string ; } interface Cat extends Pet { c : string ; } interface Stack < T > { push ( value ) : void ; pop ( ) : T ; forEach ( action ) : void ; } declare let pets ; declare let dogs ; declare let cats ; pets = dogs ; dogs = pets ; dogs = cats ; pets . push ( { } as Cat ) ;