请考虑以下示例。
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());
有3个问题/问题:
答案 0 :(得分:10)
|undefined
不会使属性成为可选属性,只是意味着它可以为undefined
,有人建议使|undefined
成员为可选属性,但目前尚未实现。您需要在?
之后使用]
,以使所有属性为可选
{ [key in DialogType]?: Dialog }
您可以将对话框枚举值用作键,但是需要计算它们的属性:
let openDialogs: { [key in DialogType]?: Dialog } = {
[DialogType.Options]: undefined,
};
{ [key: number or string]: Dialog }
是索引签名。索引签名仅限于number
或string
作为密钥类型(即使两者都不能使用)。因此,如果您使用索引签名,则可以通过任何number
或string
进行索引(我们不能仅限制于DialogType
键)。您在此处使用的概念称为映射类型。映射类型基本上基于键的并集(在这种情况下为DialogType枚举的成员)和一组映射规则来生成新类型。我们上面创建的类型基本上等于:
let o: { [DialogType.Help]?: Dialog; [DialogType.Options]?: Dialog; }