如何在打字稿中使用枚举作为索引键类型?

时间:2018-10-08 10:49:55

标签: typescript dictionary indexing enums

请考虑以下示例。

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. 为什么即使我将属性声明为'|,我也不能忽略其初始值设定项中的属性。未定义”
  2. 为什么我不能使用'DialogType.Options'作为类型键,而必须使用硬编码数字呢?
  3. 为什么必须使用“ DialogType中的键”而不是“ key:DialogType”? (或者我可以吗?)

1 个答案:

答案 0 :(得分:10)

  1. |undefined不会使属性成为可选属性,只是意味着它可以为undefined,有人建议使|undefined成员为可选属性,但目前尚未实现。您需要在?之后使用],以使所有属性为可选

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

    let openDialogs: { [key in DialogType]?: Dialog } = {
        [DialogType.Options]: undefined,
    };
    
  3. { [key: number or string]: Dialog }是索引签名。索引签名仅限于numberstring作为密钥类型(即使两者都不能使用)。因此,如果您使用索引签名,则可以通过任何numberstring进行索引(我们不能仅限制于DialogType键)。您在此处使用的概念称为映射类型。映射类型基本上基于键的并集(在这种情况下为DialogType枚举的成员)和一组映射规则来生成新类型。我们上面创建的类型基本上等于:

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