Возможно ли иметь emun, которые могут как возвращать строковые значения, так и знать порядок их перечисления?

#typescript

#typescript

Вопрос:

У меня есть следующая строка enum:

 enum QuotationProgress {
    Designing = 'designing',
    QuoteSent = 'quoteSent',
    QuoteAccepted = 'quoteAccepted',
    Installed = 'installed',
    Done = 'done',
}
  

Он описывает процесс, поэтому Designing перед QuoteSent , и так далее. Я хотел бы сделать что-то вроде:

 function(currentState, someState) {
    if (someState < currentState) {
        return 'some state is in the past'
    }
}
  

Какой хороший способ добавить эту информацию о порядке в enum?

Комментарии:

1. Перечисления TS сохраняются во время выполнения через объекты, что позволяет повторять их в порядке определения свойств.

2. какую версию TS вы используете? Недавно был анонсирован TS 3.4, и, возможно, const assertions — это то, что вы ищете

Ответ №1:

Перечисления в TypeScript на самом деле не являются расширяемыми. Я бы посоветовал вам хранить любую дополнительную информацию в структуре данных рядом с перечислением.

Вот как вы могли бы добавить порядок в виде отдельной структуры данных:

 const quotationProgressOrder: Record<QuotationProgress, number> = {
  [QuotationProgress.Designing]: 0,
  [QuotationProgress.QuoteSent]: 1,
  [QuotationProgress.QuoteAccepted]: 2,
  [QuotationProgress.Installed]: 3,
  [QuotationProgress.Done]: 4,
}  

function f(currentState: QuotationProgress, someState: QuotationProgress) {
  if (quotationProgressOrder[someState] < quotationProgressOrder[currentState]) {
    return 'some state is in the past'
  }
}
  

В зависимости от вашего варианта использования этого может быть достаточно. Или вы можете обнаружить, что хотите создать свой собственный объект, подобный перечислению, который содержит всю информацию, и полностью забыть об использовании enum .

Надеюсь, это поможет. Удачи!