title: How to use enum as index key type in typescript?
body: <p>Consider following example.</p>
  
  <pre><code>enum DialogType {
      Options,
      Help
  }
  
  class Dialog { 
      test() : string {
          return "";
      }
  }
  
  class Greeter {
  
      openDialogs: { [key in DialogType]: Dialog | undefined } = {
          0: undefined,
          1: undefined
      };
  
      getDialog(t: DialogType) {
          return this.openDialogs[t];
      }
  }
  
  const greeter = new Greeter();
  const d = greeter.getDialog(DialogType.Help);
  if (d) document.write(d.test());
  </code></pre>
  
  <p><a href="https://www.typescriptlang.org/play/#src=enum%20DialogType%20%7B%0D%0A%20%20%20%20Options%2C%0D%0A%20%20%20%20Help%0D%0A%7D%0D%0A%0D%0Aclass%20Dialog%20%7B%20%0D%0A%20%20%20%20test()%20%3A%20string%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Greeter%20%7B%0D%0A%0D%0A%20%20%20%20openDialogs%3A%20%7B%20%5Bkey%20in%20DialogType%5D%3A%20Dialog%20%7C%20undefined%20%7D%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%200%3A%20undefined%2C%0D%0A%20%20%20%20%20%20%20%201%3A%20undefined%0D%0A%20%20%20%20%7D%3B%0D%0A%0D%0A%20%20%20%20getDialog(t%3A%20DialogType)%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20this.openDialogs%5Bt%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Aconst%20greeter%20%3D%20new%20Greeter()%3B%0D%0Aconst%20d%20%3D%20greeter.getDialog(DialogType.Help)%3B%0D%0Aif%20(d)%20document.write(d.test())%3B" rel="noreferrer">Also in playground</a></p>
  
  <p>There are 3 issues/questions with it:</p>
  
  <ol>
  <li>Why I cannot omit properties in my initializer literal, even though I declare properties as '| undefined'</li>
  <li>Why I cannot use 'DialogType.Options' as type key, and have to use hardcoded number instead?</li>
  <li>Why do I have to use 'key in DialogType' instead of 'key: DialogType'? (Or can I? )</li>
  </ol>