title: Prevent TypeScript from expanding a string literal type into a string type when passing it through a function
body: <p>How do we prevent TypeScript from expanding a string literal type into a string? </p>
  
  <p>E.g. <a href="https://www.typescriptlang.org/play/#src=type%20PropertyName%20%3D%20&#39;Property1&#39;%20%7C%20&#39;Property2&#39;%3B%0D%0A%0D%0Atype%20ObjectWithPropertyName%20%3D%0D%0A%20%20%20%20%7B%20Property1%3A%20string%3B%20%7D%20%7C%0D%0A%20%20%20%20%7B%20Property2%3A%20string%3B%20%7D%3B%0D%0A%20%20%0D%0Aconst%20obj1%3A%20ObjectWithPropertyName%20%3D%20%7B%0D%0A%20%20%20%20%5B&#39;Property1&#39;%5D%3A%20&#39;works&#39;%2C%0D%0A%7D%0D%0A%0D%0Aconst%20prop%3A%20PropertyName%20%3D%20&#39;Property1&#39;%3B%0D%0Aconst%20obj2%3A%20ObjectWithPropertyName%20%3D%20%7B%0D%0A%20%20%20%20%5Bprop%5D%3A%20&#39;works&#39;%2C%0D%0A%7D%0D%0A%0D%0Aconst%20func%20%3D%20(prop%3A%20PropertyName)%20%3D%3E%20%7B%0D%0A%20%20%20%20const%20obj%3A%20ObjectWithPropertyName%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%5Bprop%5D%3A%20%22fails%22%2C%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%3B%0D%0A%0D%0Aconst%20funcToo%20%3D%20(prop%3A%20PropertyName)%20%3D%3E%20%7B%0D%0A%20%20%20%20const%20propInner%3A%20PropertyName%20%3D%20prop%3B%0D%0A%20%20%20%20const%20obj%3A%20ObjectWithPropertyName%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%5BpropInner%5D%3A%20%22fails%22%2C%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%3B" rel="nofollow noreferrer">in the Playground</a></p>
  
  <pre><code>type PropertyName = 'Property1' | 'Property2';
  
  type ObjectWithPropertyName =
      { Property1: string; } |
      { Property2: string; };
  
  const obj1: ObjectWithPropertyName = {
      ['Property1']: 'works',
  }
  
  const prop: PropertyName = 'Property1';
  const obj2: ObjectWithPropertyName = {
      [prop]: 'works',
  }
  
  const func = (prop: PropertyName) =&gt; {
      const obj: ObjectWithPropertyName = {
          [prop]: "fails",
      };
  };
  
  const funcToo = (prop: PropertyName) =&gt; {
      const propInner: PropertyName = prop;
      const obj: ObjectWithPropertyName = {
          [propInner]: "fails",
      };
  };
  </code></pre>
  
  <p>In the last case the error is this: </p>
  
  <blockquote>
    <p>Property 'Property1' is missing in type '{ [x: string]: string; }' but required in type 'ObjectWithPropertyName'.</p>
  </blockquote>