Как запрашивать перечисления строк в строгом режиме TypeScript?

Это более чем немного поздно, но вы также можете расширить выражение регулярного выражения для учета научной нотации.

import re

# Format is [(, ), ...]
ss = [("apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3",
       ['-12.34', '33', '-14.23e-2', '+45e5', '+67.56E+3']),
      ('hello X42 I\'m a Y-32.35 string Z30',
       ['42', '-32.35', '30']),
      ('he33llo 42 I\'m a 32 string -30', 
       ['33', '42', '32', '-30']),
      ('h3110 23 cat 444.4 rabbit 11 2 dog', 
       ['3110', '23', '444.4', '11', '2']),
      ('hello 12 hi 89', 
       ['12', '89']),
      ('4', 
       ['4']),
      ('I like 74,600 commas not,500', 
       ['74,600', '500']),
      ('I like bad math 1+2=.001', 
       ['1', '+2', '.001'])]

for s, r in ss:
    rr = re.findall("[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?", s)
    if rr == r:
        print('GOOD')
    else:
        print('WRONG', rr, 'should be', r)

Дает все хорошее!

Кроме того, вы можете посмотрите на встроенное регулярное выражение AWS Glue

0
задан Pascal Precht 13 July 2018 в 11:45
поделиться

2 ответа

Я думаю, проблема в том, что вы даете вашей карте тип: 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], всегда будут известным строковым литералом.

2
ответ дан KwintenP 17 August 2018 в 13:02
поделиться

Проблема заключается в том, что в строке, определяющей typeParam, вы назначаете string (queryParam.tab - это строка, которую я себе представляю? Либо это, либо any), к keyof typeof TabIndex. string может содержать любое строковое значение, поэтому его нельзя присваивать переменной, которая принимает только четыре конкретных значения.

Но если вы уверены, что tab всегда будет тем, что вы ожидаете от вас может сделать утверждение:

type TabIndexKey = keyof typeof TabIndex;
const tabParam: TabIndexKey = this.urlSerializer.parse(this.location.path()).queryParams.tab as TabIndexKey.

Если queryParams.tab равно any, решение будет тем же самым.

EDIT: Чтобы избежать ошибки с неявным, индексы для перечислений должны использовать числа, а не строки. Это означает, что:

TabIndex['editor']; // error with not implicit any
TabIndex[0]; // correct

Итак, я рекомендую вам изменить определение вашего перечисления и карту tabs. Вместо назначения строк присвойте числа:

export enum TabIndex {
  Editor = 0,
  Console = 1,
  Settings = 2,
  Outputs = 3
}

const tabs = new Map(<[string, number][]>Object.keys(TabIndex).map((key: any) => [key, TabIndex[key]]));

Конечно, делая это, мы немного лежим, потому что tabs на самом деле не является <string, number>. На самом деле он имеет как строки, так и числа. Цифровые клавиши указывают на имена свойств, а строковые ключи указывают на их числовые эквиваленты. Однако, мы можем забыть об этом, поскольку вы собираетесь использовать только строковые ключи.

Теперь TabIndex[this.tabs.get(tabParam)!] работает правильно, так как this.tabs.get возвращает number.

Надеюсь, это вам поможет.

0
ответ дан Oscar Paz 17 August 2018 в 13:02
поделиться
  • 1
    Это все равно оставляет меня: TS7015: Элемент неявно имеет тип «any», потому что выражение индекса не относится к типу «число». для this.selectTab (TabIndex [this.tabs.get (tabParam)!]); – Pascal Precht 13 July 2018 в 12:10
  • 2
    Отредактировал мой ответ – Oscar Paz 13 July 2018 в 12:41
  • 3
    Итак, нет способа правильно сохранить перечисление со строковыми значениями? Это печально, потому что тогда мне придется представить еще одну карту, которая отображает индексы в фактические значения строк, чтобы сохранить функциональность управления выбранной вкладкой с помощью параметров запроса ... – Pascal Precht 13 July 2018 в 12:57
Другие вопросы по тегам:

Похожие вопросы: