function extend‹T, U›(first: T, second: U): T & U { let result = ‹T & U›{}; for (let id in first) { (‹any›result)[id] = (‹any›first)[id]; } for (let id in second) { if (!result.hasOwnProperty(id)) { (‹any›result)[id] = (‹any›second)[id]; } } return result; } class Person { constructor(public name: string) { } } interface Loggable { log(): void; } class ConsoleLogger implements Loggable { log() { // ... } } var jim = extend(new Person("Jim"), new ConsoleLogger()); var n = jim.name; jim.log();