Выбор ответа Junior Объединения и сужение обновлено

Сужение типов без классов

Вопрос

Cat и Dog объявлены через type. Какая проверка сузит a до Cat?

type Cat = { meow(): void };
type Dog = { bark(): void };

function speak(a: Cat | Dog) {
  if (/* ? */) a.meow();
  else a.bark();
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: 'meow' in a. Оператор in проверяет наличие свойства у объекта, и TypeScript сужает объединение до вариантов, где такое свойство есть. instanceof работает только с классами (значениями в рантайме), а Cat это тип, его нет в JS. typeof возвращает лишь…

Варианты ответа

  1. a instanceof Cat
  2. 'meow' in aправильный ответ
  3. typeof a === 'Cat'
  4. a as Cat

Разбор

Оператор in проверяет наличие свойства у объекта, и TypeScript сужает объединение до вариантов, где такое свойство есть.

instanceof работает только с классами (значениями в рантайме), а Cat это тип, его нет в JS. typeof возвращает лишь 'object', 'string' и подобные, имена типов он не знает. as не проверяет, а приказывает компилятору.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.