Как убедиться, что ваш
switch покрывает все кейсы, а default остаётся только на случай косяков в рантайме?Очень просто! Два варианта:
1. Используем
never, от Кори Хауса:
interface Dog {
kind: "dog";
favoriteToy: string;
}
interface Parrot {
kind: "parrot";
knowsWords: number;
}
type Pet = Dog | Parrot;
function logPetTalent(pet: Pet) {
switch (pet. kind) {
case "dog":
return console. log (Dog loves ${pet. favoriteToy}. ');
case "parrot":
return console. log (Parrot knows ${pet.knowsWords} words. *);
default:
const exhaustiveCheck: never = pet;
}
}
2. Второй вариант — ESLint и правило
switch-exhaustiveness-check. И уже дальше решаем, разрешать default, или нет. Конфигураия это позволяет.Впрочем, мы у себя вообще переходим на pattern matching, о чём как-нибудь в следующий раз.
#ts #switch