typeof guard

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

TypeScript позволяет сужать (narrowing) типы внутри условных блоков. Самый простой способ сделать это — использовать оператор typeof.

Оператор typeof возвращает строку, указывающую тип операнда ('string', 'number', 'boolean', 'symbol', 'undefined', 'object', 'function'). Если вы проверите переменную в условии if (typeof x === 'string'), то внутри этого блока TypeScript будет точно знать, что x — это строка, и разрешит использовать строковые методы.

Изучите примеры и задания, чтобы понять, как безопасно работать с переменными типа unknown или union types.

Список тем

1. Базовая проверка типа

id: 40686_typeof_basic_replace

Дополните фрагмент кода функции processValue, которая принимает параметр типа string | number. В условии if необходимо использовать typeof guard для проверки, является ли значение числом. Заполните пропуски так, чтобы функция корректно выводила отформатированное число (с двумя знаками после запятой) или строку в верхнем регистре. Обратите внимание, что пропущены ключевое слово typeof и строковый литерал, указывающий на тип 'number'.

Заполните пропуски
function processValue(value: string | number) {
    if (input1S value === input2S) {
        console.log("Число: " + value.toFixed(2));
    } else {
        console.log("Строка: " + value.toUpperCase());
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Зона действия Guard

id: 40686_click_guard_zone

Внимательно изучите приведённый код на TypeScript. В функции используется typeof guard для проверки типа переменной. Ваша задача — отметить все строки кода, в которых переменная `value` гарантированно имеет тип `string` благодаря проверке `typeof`. Не отмечайте строки, где тип `value` остаётся объединённым (`string | number`) или сужается к `number`.

Кликните по всем фрагментам, которые подходят под условие задания.
function processValue(value: string | number): void {
  {{console.log("Входное значение:", value);~|~t1}}

  if (typeof value === "string") {
    {{console.log("Это строка, длина:", value.length);~|~t2}}
    {{const upper = value.toUpperCase();~|~t3}}
    {{console.log("В верхнем регистре:", upper);~|~t4}}
  } else if (typeof value === "number") {
    {{console.log("Это число, квадрат:", value * value);~|~t5}}
    {{const fixed = value.toFixed(2);~|~t6}}
    {{console.log("С двумя знаками:", fixed);~|~t7}}
  }

  {{console.log("Обработка завершена.");~|~t8}}
}
Сообщения
Проверить
Показать подсказку

3. Значения typeof

id: 40686_typeof_return_values_compare

В левой колонке приведены примеры значений в TypeScript, а в правой — возможные строки, которые возвращает оператор typeof. Сопоставьте каждое значение слева с правильным результатом применения typeof. Обратите внимание, что некоторые значения могут возвращать одинаковые строки, но в данном задании каждый правый вариант используется только один раз.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
5
'hello'
true
undefined
function() {}
Symbol()
string
boolean
function
symbol
undefined
number
Сообщения
Проверить
Показать подсказку

4. Опечатка в литерале

id: 40686_typo_in_guard_error

В этом фрагменте кода TypeScript используется type guard с оператором typeof для сужения типа переменной. Однако в условии допущена опечатка, из-за которой проверка не сработает корректно. Найдите и исправьте ошибку в строке с условием, чтобы код правильно определял тип переменной и выполнял соответствующую ветку.

Найдите ошибку и исправьте
let x: string | number = 'hello';
if (typeof x === 'strng') {
    console.log('x is a string');
} else {
    console.log('x is not a string');
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Результат сужения

id: 40686_predict_narrowing_outcome

Проанализируйте код функции printId на TypeScript. Функция принимает параметр типа number | string. Внутри функции с помощью typeof guard проверяется, является ли параметр строкой. Если это строка, то возвращается её версия в верхнем регистре, иначе возвращается сам параметр. Код вызывает функцию с аргументом 42. Определите, что будет выведено в консоль, или возникнет ли ошибка. Выберите правильный вариант из предложенных.

Выберите правильный вариант ответа
function printId(id: number | string) {
  // typeof guard
  if (typeof id === 'string') {
    return id.toUpperCase();
  }
  return id;
}

const result = printId(42);
console.log(result);
Сообщения
Проверить
Показать подсказку

6. Сборка логики Guard

id: 40686_build_guard_logic

Из предложенных строк соберите корректный фрагмент TypeScript-кода, который использует typeof guard для проверки типа переменной `value`. Если переменная имеет тип `number`, умножьте её на 2. Если переменная имеет тип `string`, выполните конкатенацию с добавлением строки ' world'. Игнорируйте лишние строки, не входящие в решение. Правильный порядок строк должен соответствовать логике: объявление переменной, проверка типа через typeof, выполнение соответствующей операции и вывод результата.

Перетяните в правильном порядке строки из одного блока в другой
let value: number | string = 10;
if (typeof value === 'number') {
    value = value * 2;
} else if (typeof value === 'string') {
    value = value + ' world';
}
console.log(value);
let value: boolean = true;
if (typeof value === 'boolean') {
    value = !value;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Выбор оператора

id: 40686_select_guard_operator

В данном задании вам предстоит заполнить пропуски в коде TypeScript, чтобы корректно проверить, является ли переменная типа boolean | undefined равной undefined. Используйте выпадающие списки для выбора подходящих операторов и значений. Обратите внимание на разницу между typeof guard и обычным сравнением с undefined.

Нужно правильно расставить в пропуски предложенные варианты
let value: boolean | undefined = true;

if (input1S) {
    console.log('value is undefined');
} else {
    console.log('value is boolean');
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Анализ потока типов

id: 40686_analyze_control_flow

Проанализируйте TypeScript-код сверху и расставьте шаги снизу в правильном порядке, чтобы получилась логика выполнения программы. Вам нужно восстановить последовательность рассуждений о типе переменной, используя typeof guard для сужения union-типа.

function processValue(value: string | number): string {
  if (typeof value === 'number') {
    return `Число: ${value * 2}`;
  }
  // На этом этапе TypeScript знает, что value - string
  return `Строка: ${value.toUpperCase()}`;
}

const result = processValue(10);
console.log(result);
Расположите элементы в логичном порядке
Вызов функции processValue с аргументом 10 (тип number).
TypeScript сужает тип value до number внутри блока if.
Присвоение возвращённого значения переменной result и вывод в консоль.
Выполнение ветки для number: вычисление value * 2 (20) и возврат строки 'Число: 20'.
Проверка typeof value === 'number' - условие истинно, так как value равно 10.
Объявление функции processValue с параметром value типа string | number.
Функция завершается с возвратом значения, дальнейший код (проверка на string) не выполняется.
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40686_compiler

Добро пожаловать в мир сужения типов! Оператор `typeof` — это ваш первый инструмент для того, чтобы убедить TypeScript в том, какой именно тип данных находится в переменной прямо сейчас. В примере ниже функция умеет работать и со строками, и с числами, но делает это по-разному. Попробуйте убрать одну из проверок `if` и посмотрите, как компилятор сразу запретит вам использовать специфичные методы (например, `.toUpperCase()`). Экспериментируйте: добавьте поддержку типа `boolean` или попробуйте передать в функцию массив!

TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру