Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
Внутри if тип id сужен до string, поэтому toUpperCase доступен. После return из ветки остаётся единственный вариант, number, и компилятор знает об этом без всякой подсказки.
Анализ идёт по потоку выполнения (control flow analysis). Условие typeof id === "string" для TypeScript не просто выражение: он видит, что в положительной ветке значение может быть только строкой, а в отрицательной строкой быть не может. Убрать вариант из union достаточно, чтобы остался ровно один.
Проверить себя можно, наведя курсор на id в каждой ветке: редактор покажет string и number.
Вариант с else работает так же:
Ранний возврат обычно читается лучше: меньше вложенности, и «основной» путь остаётся в теле функции.
Оператор возвращает одну из строк: "string", "number", "bigint", "boolean", "symbol", "undefined", "object", "function". Этого хватает для примитивов, но у него есть известная особенность: typeof null даёт "object", так что проверка на null через него не работает.
Для объектов разных форм typeof тоже бесполезен: у всех будет "object". Там нужны другие инструменты, оператор in и дискриминированные объединения, им посвящены следующие два задания.