title: TypeScript Object.assign confusion
body: <p>When I look at the <a href="https://github.com/Microsoft/TypeScript/blob/master/lib/lib.es6.d.ts#L4405" rel="noreferrer">signature of <code>Object.assign</code></a> I see that it uses intersection types, but the behavior is not what I expected.</p>
  
  <p>I want to use <code>Object.assign</code> to merge some changes with an old object to create a new object (as is common practice in JS when following immutable data patterns) and have TypeScript validate that the parts and the result are correct, but it seems TypeScript allows anything through without an error.</p>
  
  <p>For example:</p>
  
  <pre><code>interface Thing {
      name: string;
      age: number;
      fav: boolean;
  }
  
  let oldThing: Thing = {
      name: "Aaa",
      age: 123,
      fav: false
  };
  
  let newThing: Thing = Object.assign({}, oldThing, {
      name: "Bbb",
      age: "abc", // should be type error
      fake: "fakey" // should be unknown prop error
  });
  </code></pre>
  
  <p><a href="http://www.typescriptlang.org/play/#src=interface%20Thing%20%7B%0D%0A%20%20%20%20name%3A%20string%3B%0D%0A%20%20%20%20age%3A%20number%3B%0D%0A%20%20%20%20fav%3A%20boolean%3B%0D%0A%7D%0D%0A%0D%0Alet%20oldThing%3A%20Thing%20%3D%20%7B%0D%0A%20%20%20%20name%3A%20%22Aaa%22%2C%0D%0A%20%20%20%20age%3A%20123%2C%0D%0A%20%20%20%20fav%3A%20false%0D%0A%7D%3B%0D%0A%0D%0Alet%20newThing%3A%20Thing%20%3D%20Object.assign(%7B%7D%2C%20oldThing%2C%20%7B%0D%0A%20%20%20%20name%3A%20%22Bbb%22%2C%0D%0A%20%20%20%20age%3A%20%22abc%22%2C%20%2F%2F%20should%20be%20type%20error%0D%0A%20%20%20%20fake%3A%20%22fakey%22%20%2F%2F%20should%20be%20unknown%20prop%20error%0D%0A%7D)%3B%0D%0A" rel="noreferrer">Here it is in the playground.</a></p>
  
  <p>Why does <code>Object.assign</code> allow this incorrect assignment to <code>Thing</code>? Is there a way to make this work close to what I expected?</p>