Я думаю, проблема в том, что вы даете вашей карте тип: Map<string, string>
. Это вызвано тем, как вы создали свою карту: new Map(<[string, string][]> ...)
.
Это вызывает ошибку, которую вы получаете: Type 'string' is not assignable to type '"Editor" | "Console" | "Settings" | "Outputs"'
В следующем фрагменте вы пытаетесь использовать значение этой Карты, вызвав метод get
с ключом. Это, однако, возвращает строку (поскольку тип вашей карты был определен как имеющий значения строки типа.
this.selectTab(TabIndex[this.tabs.get(tabParam)!]);
Оператор TabIndex[xxxx]
, однако, ожидает, что 'xxxx' является одним из следующих значений "Editor" | "Console" | "Settings" | "Outputs"
, поскольку вы можете вычесть из сообщения об ошибке выше.
Чтобы исправить это, вам нужно изменить тип своей Карты, чтобы машинописный текст знал, что «xxxx» в фрагмент выше всегда будет одним из этих значений. Для этого вам нужно создать «типы объединения этих конкретных строковых литералов». К счастью, машинопись позволяет нам извлечь из определения TabIndex
.
keyof typeof TabIndex
Это разрешит «тип объединения строковых литералов», необходимый для правильного ввода Карты.
Итак, чтобы подвести итог, измените создание на карте:
const tabs = new Map(<[string, keyof typeof TabIndex][]>Object.keys(TabIndex).map((key: any) => [TabIndex[key], key]));
Это будет гарантировать, что значения из Карты, которые могут быть переданы в TabIndex [xxxx], всегда будут известным строковым литералом.