Существуют ли альтернативы pattern matching в JavaScript/ECMAScript?

Как я понимаю, предложение добавить поддержку программирования с шаблонами в ECMAScript <a href="https://github.com/tc39/proposal-pattern-matching" rel="nofollow">сейчас находится на ранней стадии</a>. <br/><br/> Какие существуют альтернативные решения на данный момент, чтобы не создавать свои собственные подходы? Могу ли я использовать какую-нибудь библиотеку или применить обходной метод? <br/><br/> Я хотел бы улучшить читаемость своего кода, например, следующий фрагмент: <br/><br/> <pre><code class="javascript">function foo(param) { … }

const val = getVal();
foo(val === 0 ? 'none' : (val &gt; 0 ? 'up' : 'down')); // вобще жестб</code></pre>
  • 10 апреля 2025 г. 16:15
Ответы на вопрос 2
В JavaScript действительно нет встроенной поддержки pattern matching (сопоставления с образцом) на данный момент, но существует несколько альтернативных подходов, которые могут помочь сделать ваш код более читаемым.

1. **Обычные функции**:
   Вы можете использовать обычные функции для улучшения читаемости кода. Например, вы можете вынести логику выбора в отдельную функцию:

   ```javascript
   function mapValueToString(val) {
      if (val === 0) {
          return 'none';
      } else if (val > 0) {
          return 'up';
      } else {
          return 'down';
      }
   }

   const val = getVal();
   foo(mapValueToString(val));
   ```

2. **Объект для сопоставления**:
   Можно использовать объект для сопоставления значений:

   ```javascript
   function mapValueToString(val) {
       const mapping = {
           0: 'none',
           'positive': 'up',
           'negative': 'down'
       };
       if (val > 0) {
           return mapping['positive'];
       } else if (val < 0) {
           return mapping['negative'];
       }
       return mapping[0];
   }

   const val = getVal();
   foo(mapValueToString(val));
   ```

3. **Использование библиотек**:
   Существуют библиотеки, которые реализуют функциональность, похожую на pattern matching. Одна из них — это библиотека `ts-pattern`, которая предлагает синтаксис сопоставления:

   ```javascript
   import { match } from 'ts-pattern';

   const result = match(val)
       .with(0, () => 'none')
       .with(Number.NEGATIVE_INFINITY, () => 'down')
       .with(Number.POSITIVE_INFINITY, () => 'up')
       .run();

   foo(result);
   ```

   Имейте в виду, что эта библиотека в основном предназначена для TypeScript, но вы также можете использовать её с JavaScript, если это вам необходимо.

4. **Использование конструкции switch**:
   Если у вас есть несколько условий, которые легко можно представить в виде `switch`, это также может быть хорошим вариантом:

   ```javascript
   function mapValueToString(val) {
       switch (true) {
           case val === 0:
               return 'none';
           case val > 0:
               return 'up';
           case val < 0:
               return 'down';
       }
   }

   const val = getVal();
   foo(mapValueToString(val));
   ```

Каждый из этих подходов помогает повысить читаемость и поддерживаемость кода по сравнению с тернарными операторами. Выбор подхода зависит от ваших предпочтений и конкретных требований к коду.
switch (Math.sign(value)) {
    case 0: return 'none';
    case 1: return 'up';
    default: return 'down';
  }
Похожие вопросы