[英]How to use enum as index key type in typescript?
Consider following example.考虑以下示例。
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());
There are 3 issues/questions with it:它有 3 个问题/问题:
|undefined
does not make a property optional, just means it can be undefined
, there is a proposal to make |undefined
members optional but currently it's not implemented. |undefined
不会使属性可选,只是意味着它可以是undefined
,有一个提议让|undefined
成员可选,但目前它没有实现。 You need to use ?
你需要使用
?
after ]
to make all properties optional after
]
使所有属性可选
{ [key in DialogType]?: Dialog }
You can use the dialog enum values as keys, but they need to be computed properties:您可以使用对话框枚举值作为键,但它们需要计算属性:
let openDialogs: { [key in DialogType]?: Dialog } = { [DialogType.Options]: undefined, };
{ [key: number or string]: Dialog }
is an index signature. { [key: number or string]: Dialog }
是一个索引签名。 Index signatures are restricted to only number
or string
as the key type (not even a union of the two will work).索引签名仅限于
number
或string
作为键类型(甚至两者的联合都不起作用)。 So if you use an index signature you can index by any number
or string
(we can't restrict to only DialogType
keys).因此,如果您使用索引签名,则可以按任何
number
或string
进行索引(我们不能仅限于DialogType
键)。 The concept you are using here is called mapped types.您在此处使用的概念称为映射类型。 Mapped types basically generate a new type based on a union of keys (in this case the members of DialogType enum) and a set of mapping rules.
映射类型基本上基于键的联合(在本例中为 DialogType 枚举的成员)和一组映射规则生成新类型。 The type we created above is basically equivalent to:
我们上面创建的类型基本上等同于:
let o: { [DialogType.Help]?: Dialog; [DialogType.Options]?: Dialog; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.