代码之家  ›  专栏  ›  技术社区  ›  ironic

如何在typescript中使用enum作为索引键类型?

  •  3
  • ironic  · 技术社区  · 6 年前

    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());
    

    Also in playground

    有3个问题:

    1. 为什么我不能在初始值设定项文本中省略属性,即使我将属性声明为“| undefined”
    2. 为什么我不能使用“DialogType.Options”作为类型键,而必须使用硬编码数字?
    1 回复  |  直到 5 年前
        1
  •  141
  •   Titian Cernicova-Dragomir    6 年前
    1. |undefined 不使属性成为可选的,只是意味着它可以是可选的 undefined ,有个建议要提 |未定义 成员是可选的,但目前尚未实现。你需要使用 ? 之后 ]

      { [key in DialogType]?: Dialog }
      
    2. 您可以将对话框枚举值用作键,但它们需要由以下属性计算:

      let openDialogs: { [key in DialogType]?: Dialog } = {
          [DialogType.Options]: undefined,
      };
      
    3. { [key: number or string]: Dialog } number string 作为键类型(即使两者的并集也不起作用)。所以如果你使用索引签名,你可以用任何 一串 DialogType 钥匙)。这里使用的概念称为映射类型。映射类型基本上基于键的联合(在本例中是DialogType enum的成员)和一组映射规则生成一个新类型。我们在上面创建的类型基本上等同于:

      let o: { [DialogType.Help]?: Dialog; [DialogType.Options]?: Dialog; }