Equality narrowing

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

Тренажер по TypeScript

Equality narrowing — это механизм TypeScript, который сужает тип переменной после проверки на равенство. Когда ты сравниваешь значение с конкретным литералом или другой переменной, компилятор понимает более точный тип внутри условия.

Пример:

function process(x: string | number) {
if (x === "hello") {
// здесь x имеет тип "hello"
}
}

  • Работает с операторами ===, !==, ==, !=
  • Можно сравнивать с null, undefined, литералами
  • После проверки TypeScript «знает» более точный тип

Этот тренажёр по TypeScript поможет понять, как использовать проверки равенства для сужения типов в реальном коде.

Список тем

1. Добавь проверку равенства

id: 40688_equality_01_replace

Дан код функции processValue, которая принимает параметр value типа string | number. Внутри условия нужно вставить оператор сравнения и значение для сужения типа так, чтобы в блоке if TypeScript рассматривал value как строку. Заполните пропуски, чтобы код корректно выполнялся. Обратите внимание на комментарий в коде.

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

2. Исправь проверку

id: 40688_equality_02_error

В этом фрагменте кода TypeScript используется сужение типов (type narrowing) через проверку равенства (equality narrowing), но допущена ошибка в операторе сравнения. Исправьте строку с ошибкой, чтобы функция корректно определяла тип переменной и выводила соответствующее сообщение. Обратите внимание на правильный оператор для сравнения значений.

Найдите ошибку и исправьте
function processValue(value: string | null) {
    if (value = "hello") {
        console.log("Greeting received");
    } else {
        console.log("No greeting");
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Собери код с narrowing

id: 40688_equality_04_build

Из предложенных строк соберите корректную TypeScript-функцию, которая использует сужение типов (equality narrowing). Функция принимает параметр типа string | number и выводит приветствие: если значение равно строке 'admin', то выводит 'Welcome, admin!', иначе выводит 'Hello, user!'. Одна из строк лишняя и в решение входить не должна.

Перетяните в правильном порядке строки из одного блока в другой
function processValue(value: string | number) {
    if (value === 'admin') {
        console.log('Welcome, admin!');
    } else {
        console.log('Hello, user!');
    }
        console.log('This is a decoy');
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Какой тип после проверки?

id: 40688_equality_05_predict

Рассмотрите приведенный код на TypeScript. Внутри условия if выполняется проверка на равенство переменной конкретному значению. Какой тип будет у переменной status внутри блока if? Выберите один правильный вариант из предложенных. Обратите внимание на union-тип переменной и механизм сужения типов (narrowing) через проверку равенства.

Выберите правильный вариант ответа
let status: "success" | "error" | "loading";
status = "success";
if (status === "success") {
    // Какой тип у status здесь?
    console.log(status.toUpperCase());
}
Сообщения
Проверить
Показать подсказку

5. Логика сужения типа

id: 40688_equality_06_analyze

Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов выполнения программы. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как программа обрабатывает входные данные с использованием equality narrowing (сужения типов через проверку на равенство).

function processValue(value: string | null): void {
  if (value === null) {
    console.log('Значение отсутствует');
  } else {
    console.log(`Длина строки: ${value.length}`);
  }
}

// Входные данные
processValue('Hello');
processValue(null);
Расположите элементы в логичном порядке
Ветка else: тип value сужается до string, вычисляется длина строки
Проверка аргумента на равенство null с помощью === (equality narrowing)
Ветка if: тип value сужается до null, выполняется действие для отсутствующего значения
Вызов функции processValue с аргументом null (тип string | null)
Вывод в консоль: Значение отсутствует (для второго вызова)
Вывод в консоль: Длина строки: 5 (для первого вызова)
Вызов функции processValue с аргументом 'Hello' (тип string | null)
Сообщения
Проверить
Показать подсказку

6. Проверки и результаты

id: 40688_equality_07_compare

В левой колонке приведены различные проверки равенства (===, !==) в TypeScript, а в правой — типы, к которым сужается переменная в соответствующей ветке кода после выполнения проверки. Сопоставьте каждую проверку слева с правильным типом справа. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок типов перемешан.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
value === null
value !== undefined
value === 'success'
value === false
value === 0
null
0
false
'success'
T (без undefined)
Сообщения
Проверить
Показать подсказку

7. Разметь части narrowing

id: 40688_equality_08_highlight

В данном коде TypeScript используется сужение типов через равенство (equality narrowing). Разметьте следующие элементы: union-тип параметра функции, оператор сравнения, значение для сравнения, суженный тип (указанный в комментарии) и действие, которое выполняется с суженным типом. Для разметки доступны категории: Union-тип, Оператор сравнения, Значение сравнения, Суженный тип, Действие с суженым типом.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
function processValue(value: {{string | number~|~t1}}) {
    if (value {{===~|~t2}} {{"admin"~|~t3}}) {
        // value - {{string~|~t4}}
        console.log(value.{{toUpperCase()~|~t5}});
    }
}
Суженный тип
Оператор сравнения
Действие с суженым типом
Значение сравнения
Union-тип
Сообщения
Проверить
Показать подсказку

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

id: 40688_compiler

Добро пожаловать в мир Equality Narrowing! Этот механизм позволяет TypeScript сужать типы переменных, просто сравнивая их между собой через '===' или '!=='. Попробуйте изменить аргументы функции checkTypes или добавьте новое условие сравнения, чтобы увидеть, как компилятор автоматически определяет доступные методы (например, toUpperCase). Экспериментируйте: что будет, если сравнить строку и число, или добавить проверку на null? Ваша задача — «поймать» момент, когда TypeScript понимает, что обе переменные стали строками и разрешает строковые операции.

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