How to use enum as index key type in typescript?
Solution 1:
-
|undefined
does not make a property optional, just means it can beundefined
, there is a proposal to make|undefined
members optional but currently it's not implemented. You need to use?
after]
to make all properties optional{ [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. Index signatures are restricted to onlynumber
orstring
as the key type (not even a union of the two will work). So if you use an index signature you can index by anynumber
orstring
(we can't restrict to onlyDialogType
keys). 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. The type we created above is basically equivalent to:let o: { [DialogType.Help]?: Dialog; [DialogType.Options]?: Dialog; }