Задать вопрос
SanviInvi
@SanviInvi

Как обработать новое значение в свитч?

Сейчас у меня только в рантайме падает с ошибкой,если в names лежит что то большее,чем bob и alice, но как мне сделать что бы ts это подсветил в момент разработки? Например,я добавил в names test и ts сразу об это написал.
let names = {
  bob: 'bob',
  alice: 'alice',
}

let user = names.bob;

let access = false;

switch (user) {
  case 'bob':
    access = true;
    break;
  case 'alice':
    access = false;
    break;
  default:
    throw new Error(`Ошибка, пришло ${ names }`);
}
  • Вопрос задан
  • 116 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Merion Academy
    Онлайн-курс по TypeScript
    2 месяца
    Далее
  • Skillbox
    Курс по TypeScript
    3 месяца
    Далее
  • Учебный центр IBS
    WEB-015 Язык программирования TypeScript
    1 неделя
    Далее
Решения вопроса 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Я не совсем понял общий смысл вашей конструкции, поэтому для наглядности, реализовал это в форме перечисления + тип + функция:
const Names = {
  Bob: 'bob',
  Alice: 'alice',
  // Mike: 'mike',
} as const;

type Name = typeof Names[keyof typeof Names];

function fn(name: Name): boolean {
  let access: boolean;

  switch (name) {

    case Names.Bob:
      access = true;
      break;

    case Names.Alice:
      access = false;
      break;

    default:
      const check: never = name;
      throw new Error(`Ошибка, пришло ${ check }`);
  }

  return access;
}

console.log(fn(Names.Bob)); // true

Если в names добавить еще одно значение, например mike, и не обработать его в switch, то check сразу засветиться красным с ошибкой:
TS2322: Type 'mike' is not assignable to type never
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
кстати, @typescript-eslint/switch-exhaustiveness-check — включаешь в eslint и редактор сам подсвечивает пропущенные кейсы. только names надо as const, иначе ts увидит просто string
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы