title: "Types of property 'X' are incompatible" but it is not
body: <p>I tried to create an object of an interface with properties initialized from another object like that:</p>
  
  <pre><code>id: data.reference.id
  </code></pre>
  
  <p>The properties are compatible, but typescript compiler throws an error. I don't understand why and how to avoid this error.</p>
  
  <p>(a link to test the code can be found after)</p>
  
  <pre><code>// INTERFACES AND TYPES
  type CategoryOne = 1
  type CategoryTwo = 2
  type Category = CategoryOne | CategoryTwo
  
  interface ReferenceOne {
      id: string,
      type: CategoryOne
  }
  
  interface ReferenceTwo {
      id: string,
      type: CategoryTwo
  }
  
  type Reference = ReferenceOne |  ReferenceTwo
  
  // DIRECT INIT
  let reference_OK: Reference = { // works here
      id: '1',
      type: 1
  }
  
  // INIT FROM DATA
  interface Data {
      reference: {
          id: string,
          type: Category
      }
  }
  
  let data: Data = {
      reference: {
          id: '1',
          type: 1
      }
  }
  
  let reference_KO: Reference = { // &lt;--- error here
      id: data.reference.id,      // but compatible property
      type: data.reference.type   // but compatible property
  }
  
  let param: Category = data.reference.type // == 1
  
  let reference_KO2: Reference = { // &lt;--- error here
      id: data.reference.id,       // but compatible property
      type: param                  // but compatible property
  }
  
  param = 1 // == data.reference.type, same variable
  
  let reference_OK2: Reference = { // &lt;--- no error here
      id: data.reference.id,
      type: param
  }
  </code></pre>
  
  <p><a href="https://www.typescriptlang.org/play/index.html#src=%2F%2F%20INTERFACES%20AND%20TYPES%0D%0Atype%20CategoryOne%20%3D%201%0D%0Atype%20CategoryTwo%20%3D%202%0D%0Atype%20Category%20%3D%20CategoryOne%20%7C%20CategoryTwo%0D%0A%0D%0Ainterface%20ReferenceOne%20%7B%0D%0A%20%20%20%20id%3A%20string%2C%0D%0A%20%20%20%20type%3A%20CategoryOne%0D%0A%7D%0D%0A%0D%0Ainterface%20ReferenceTwo%20%7B%0D%0A%20%20%20%20id%3A%20string%2C%0D%0A%20%20%20%20type%3A%20CategoryTwo%0D%0A%7D%0D%0A%0D%0Atype%20Reference%20%3D%20ReferenceOne%20%7C%20%C2%A0ReferenceTwo%0D%0A%0D%0A%2F%2F%20DIRECT%20INIT%0D%0Alet%20reference_OK%3A%20Reference%20%3D%20%7B%20%2F%2F%20works%20here%0D%0A%20%20%20%20id%3A%20&#39;1&#39;%2C%0D%0A%20%20%20%20type%3A%201%0D%0A%7D%0D%0A%0D%0A%2F%2F%20INIT%20FROM%20DATA%0D%0Ainterface%20Data%20%7B%0D%0A%20%20%20%20reference%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20id%3A%20string%2C%0D%0A%20%20%20%20%20%20%20%20type%3A%20Category%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Alet%20data%3A%20Data%20%3D%20%7B%0D%0A%20%20%20%20reference%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20id%3A%20&#39;1&#39;%2C%0D%0A%20%20%20%20%20%20%20%20type%3A%201%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Alet%20reference_KO%3A%20Reference%20%3D%20%7B%20%2F%2F%20%3C---%20error%20here%0D%0A%20%20%20%20id%3A%20data.reference.id%2C%20%20%20%20%20%20%2F%2F%20but%20compatible%20property%0D%0A%20%20%20%20type%3A%20data.reference.type%20%20%20%2F%2F%20but%20compatible%20property%0D%0A%7D%0D%0A%0D%0Alet%20param%3A%20Category%20%3D%20data.reference.type%20%2F%2F%20%3D%3D%201%0D%0A%0D%0Alet%20reference_KO2%3A%20Reference%20%3D%20%7B%20%2F%2F%20%3C---%20error%20here%0D%0A%20%20%20%20id%3A%20data.reference.id%2C%20%20%20%20%20%20%20%2F%2F%20but%20compatible%20property%0D%0A%20%20%20%20type%3A%20param%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20but%20compatible%20property%0D%0A%7D%0D%0A%0D%0Aparam%20%3D%201%20%2F%2F%20%3D%3D%20data.reference.type%2C%20same%20variable%0D%0A%0D%0Alet%20reference_OK2%3A%20Reference%20%3D%20%7B%20%2F%2F%20%3C---%20no%20error%20here%0D%0A%20%20%20%20id%3A%20data.reference.id%2C%0D%0A%20%20%20%20type%3A%20param%0D%0A%7D" rel="noreferrer">this code in Typescript playground</a></p>
  
  <p><strong>[update]</strong> I added the case when a new reference is created from a variable (reference_KO2 - variable initialized from a property of data - and reference_OK2 - same variable initialized with a constant)</p>
  
  <blockquote>
    <p>two behaviors with the same variable of a compatible type !</p>
  </blockquote>