Представь: у тебя есть union-тип статусов заказа или валют, и ты обрабатываешь их через
if или switch. Что произойдет, если через полгода в проект добавят новый статус, а ты забудешь добавить его обработку в функцию? Код тихо вернет undefined и сломает интерфейс.Чтобы этого избежать, используется паттерн Assert Exhaustiveness:
type Currency = 'RUB' | 'USD' | 'EUR' // Добавили EUR
// Вспомогательная функция для проверки исчерпываемости
// "value: never" работает в редакторе , и подсвечивает ошибку, если не обработали вариант
function assertExhaustiveness(value: never): never {
// Работает на сервере
throw new Error(`Необработанный вариант: ${JSON.stringify(value)}`);
}
function getCurrencyChar(currency: Currency) {
if (currency === 'RUB') return '₽';
if (currency === 'USD') return '$';
// ТУТ TS ВЫДАСТ ОШИБКУ КОМПИЛЯЦИИ:
// Argument of type 'string' (EUR) is not assignable to parameter of type 'never'.
// TS буквально заставляет тебя написать еще один if для 'EUR'!
// Если все варианты обработаны, сюды доходит только 'never'
return assertExhaustiveness(currency)
}
