Автоматическое перечисление строк

Строковое перечисление, подобное следующему, выглядит довольно избыточным, утомительным для кода и склонным к ошибкам, если вы неправильно набираете текст, создавая дубликат (см. как в последнем примере ниже)

enum Cmd{
    StartServer = "StartServer",
    StopServer = "StopServer",
    ResumServer1 = "ResumeServer1",
    ResumServer2 = "ResumeServer1"   // this would cause problems
}

Я ищу способ объявить только элементы перечисления, и значения будут автоматически соответствовать имени символа и, возможно, с префиксом

Я прибыл дальше всего на что-то вроде этого:

export function stringifyEnum(enu:any, prefix:string=undefined){   

  Object.keys(enu).forEach( k =>{
    if (isNumber(k))
        enu[k] = prefix+enu[k]
    else
        enu[k] = prefix+k
  })
}

это похоже на работу:

enum Cmd{
    StartServer,
    StopServer,
    ResumeServer1,
    ResumeServer2
}

stringifyEnum(Cmd,"Cmd")
console.log(Cmd.StartServer)  // --> CmdStartServer

При таком подходе пока единственная проблема состоит в том, что машинописный текст считает, что перечисление является числовым, и в некоторых случаях жалуется.

Есть ли лучший подход к этому (главная цель здесь - краткое перечисление) или вы видите скрытые риски в этой идее?

4 голоса | спросил tru7 8 J0000006Europe/Moscow 2018, 13:43:04

3 ответа


0
Я не думаю, что вы можете программно сделать префикс, чтобы система типов понимала его;это потребует некоторых операций над типами, которые еще не являются частью языка.Существует существующее предложение для этой функции, но, похоже, никто не работает над ней.Что касается того, чтобы ключ и значение были точно такими же, вы можете написать функцию, которая принимает список строк и выдает строго типизированную карту типа enum:Признается, что значение ---- +: = 1 =: + ---- имеет тип ---- +: = 2 =: + ---- .Вы сможете получить доступ к элементам, как и ожидалось:Официальный ---- +: = 4 =: + ---- также создает некоторые именованные типы , а ---- +: = 5 =: + ---- нет.Чтобы полностью воспроизвести типы, вам придется больше работать:Это тип объединения, упомянутый в ответе @ RobbyCornelissen.Вам это нужно, если вы собираетесь ссылаться на ---- +: = 7 =: + ---- как тип, как в:Если вам нужно сослаться на типы каждого элемента enum, вам придется выполнять еще большую работу, включая некрасивое дублирование кода:Это необходимо для ссылки на типы, такие как ---- +: = 10 =: + ---- как в:Но если вы не собираетесь делать это очень много, то вы можете пропустить ---- +: = 12 =: + ---- материал ... вы всегда можете использовать тип ---- +:= 13 =: + ---- вместо.Надеюсь, это поможет;удачи.
ответил jcalz 8 J0000006Europe/Moscow 2018, 18:56:16
0
У меня есть почти все заброшенные перечисления в TypeScript в пользу строковых литеральных типов объединения .Для вашего примера это будет выглядеть так:Этот подход даст вам те же преимущества при проверке во время компиляции, что и перечисление:
ответил Robby Cornelissen 8 J0000006Europe/Moscow 2018, 14:02:08
0
Если вы ищете способ реализовать сценарий, в котором несколько ключей могут отображаться на одно и то же значение, карта может помочь вам.Вы можете заморозить его, чтобы убедиться, что он неизменен:Если вы хотите иметь префиксные команды, получите карту с завода:
ответил Fenton 8 J0000006Europe/Moscow 2018, 16:00:33

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132