Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
В ветке if тип сужен до Dog, в else до Cat. Оба вызова легальны, и оба теста проходят.
typeof animal вернёт "object" и для кота, и для собаки, различить их так нельзя. instanceof работает с классами и их прототипами, а здесь обычные объектные литералы, никаких классов нет. Остаётся проверка по форме, и in подходит для неё лучше всего.
Иногда пишут проверку на существование метода напрямую:
Это работает, но требует приведения типа и читается хуже. in сужает тип сам.
Сужение через in опирается на то, что свойство встречается ровно в одном варианте union. Если добавить третий тип, у которого тоже есть bark, проверка перестанет однозначно указывать на Dog, и в ветке окажется объединение из двух типов.
Проверки по разным свойствам плохо масштабируются: три типа это уже цепочка из нескольких in, и легко забыть ветку. Для таких случаев есть более надёжный приём: добавить всем вариантам общее поле-метку и различать их по значению этого поля. Это дискриминированное объединение, финальное задание курса.
Стоит помнить, что in проверяет наличие ключа, а не значения. Если поле объявлено необязательным, ключ может присутствовать со значением undefined, и проверка окажется истинной:
С формами, где свойства обязательные, как в этом задании, такой проблемы нет.