Найти в Дзене
FrontMind

Как я нашёл способ быть уверенным, что все кейсы обработаны

Наверное в каждом проекте есть несколько enum'ов, значения которых надо обработать по разному, например enum состояния - в зависимости от которого у нас может меняться отображение. В начале все идет хорошо, но через какое то время в эти enum'ы добавляются новые значения и вот тут возникают проблемы — легко упустить: поправить все switch и if условия, где они используются. Вроде мелочь, но сколько раз вы натыкались на ошибки, когда код просто не ожидал определённого значения? 🙈 Тогда я начал искать решение и наткнулся на крутой способ сделать код более защищённым с помощью TypeScript и типа never. Именно эта техника помогла мне избежать лишних багов и сделать код предсказуемым. Давайте разберёмся, как она работает! export const exhaustiveCheck = (param: never): void => { console.log(`Обработайте значение ${param}`); }; Здесь never служит маркером, который указывает, что функция exhaustiveCheck вообще не должна быть вызвана — ведь все случаи должны быть обработаны. А если этот случай вд

Наверное в каждом проекте есть несколько enum'ов, значения которых надо обработать по разному, например enum состояния - в зависимости от которого у нас может меняться отображение. В начале все идет хорошо, но через какое то время в эти enum'ы добавляются новые значения и вот тут возникают проблемы — легко упустить: поправить все switch и if условия, где они используются. Вроде мелочь, но сколько раз вы натыкались на ошибки, когда код просто не ожидал определённого значения? 🙈

Тогда я начал искать решение и наткнулся на крутой способ сделать код более защищённым с помощью TypeScript и типа never. Именно эта техника помогла мне избежать лишних багов и сделать код предсказуемым. Давайте разберёмся, как она работает!

export const exhaustiveCheck = (param: never): void => {
console.log(`Обработайте значение ${param}`);
};

Здесь never служит маркером, который указывает, что функция exhaustiveCheck вообще не должна быть вызвана — ведь все случаи должны быть обработаны. А если этот случай вдруг срабатывает, значит, что-то упущено.

Теперь добавляем exhaustiveCheck в default ветвь switch:

export const getPriorityIcon = (priority: PRIORITY) => {
switch (priority) {
case PRIORITY.HIGH:
return HighIcon;
case PRIORITY.LOW:
return LowIcon;
default:
exhaustiveCheck(priority);
return UnknownIcon;
}
};

или тот же пример для if...else:

export const getPriorityIcon = (priority: PRIORITY) => {
if (priority === PRIORITY.HIGH) {
return HighIcon;
} else if (priority === PRIORITY.LOW) {
return LowIcon;
} else {
exhaustiveCheck(priority); // Сработает, если появится непредвиденный вариант
return UnknownIcon;
}
};

Если есть только HIGH и LOW - все хорошо (все варианты обработаны), но если в будущем к PRIORITY добавится новое значение, TypeScript не пропустит его (компилятор TS кинет ошибку TS2345 при сборке) без соответствующей обработки 🛑

Преимущества:

  • Меньше ошибок. Вы сразу видите, если забыли добавить новый кейс.
  • Читабельность. Поддерживается уверенность, что все возможные случаи обработаны.
  • Простота тестирования. Вы точно знаете, что ваше условие покрывает всё, что нужно.

В каких случаях это помогает?

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

Вот так с небольшой хитростью можно быть на 100% уверенным, что каждая ветвь вашего switch или if...else охвачена. Теперь каждый раз, когда мне нужно убедиться в полной обработке всех значений, я первым делом добавляю exhaustiveCheck. Попробуйте и вы — возможно, это станет вашим незаменимым инструментом в TypeScript!

🔥 А вы используете never в своих проектах? Какие ещё фишки TypeScript спасали вас от багов? Делитесь в комментариях!

Больше лайфхаков и полезных материалов вы найдете в моем Telegram-канале Frontmind. Присоединяйтесь!

#TypeScript #javascript #frontend