class Mammal{ breathe():string{ return "I'm alive!" } } class WingedAnimal { fly() :string{ return "I can fly!" } } class Bat implements Mammal,WingedAnimal{ breathe:()=>string; fly: () => string; } function applyMixins(derivedCtor:any,baseCtors:any[]){ baseCtors.forEach(baseCtor=>{ Object.getOwnPropertyNames(baseCtor.prototype).forEach(name=>{ if(name!=='constructor'){ derivedCtor.prototype[name]=baseCtor.prototype[name]; } }) }) } applyMixins(Bat,[Mammal,WingedAnimal]) var bat=new Bat(); console.log(bat.breathe()); console.log(bat.fly());