Union с null и undefined

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

Тренажер по TypeScript

В реальном мире данные часто отсутствуют или еще не загружены. В TypeScript это выражается через типы null и undefined. Использование их в составе Union типов (например, string | null) заставляет разработчика явно обрабатывать сценарии отсутствия значения.

Режим strictNullChecks запрещает присваивать null обычным переменным, требуя явного указания этого в типе. Это спасает от множества ошибок времени выполнения («cannot read property of null»).

Темы упражнения:

  • Объявление объединений с null и undefined.
  • Проверка на наличие значения перед использованием.
  • Почему number | null лучше, чем просто number (если данных может не быть).

Практика поможет вам перестать бояться ошибок, связанных с пустыми ссылками.

Список тем

1. Nullable и Non-nullable

id: 40662_null_sort_types

Перед вами список объявлений переменных в TypeScript. Разнесите их по двум категориям в соответствии с тем, может ли тип переменной содержать значения null или undefined (nullable) или же переменная всегда должна иметь значение (non-nullable). Обратите внимание на использование union типов и строгой проверки null (strictNullChecks).

Перетяните элементы в соответствующие блоки
Может быть пустым
Всегда есть значение
let username: string;
let age: number | null;
const isActive: boolean = true;
let data: string | undefined;
let counter: number;
let value: boolean | null | undefined;
const items: string[] = [];
let response: object | null;
Сообщения
Проверить
Показать подсказку

2. Объявление типа

id: 40662_null_replace_definition

В этом задании вам нужно дополнить объявление интерфейса профиля пользователя, чтобы поле 'avatar' могло принимать значение null. Это типичная ситуация, когда данные могут отсутствовать, и TypeScript позволяет явно указать это с помощью union-типов. Допишите пропущенную часть типа поля 'avatar' в интерфейсе UserProfile, чтобы код соответствовал присваиваемому значению null.

Заполните пропуски
interface UserProfile {
  username: string;
  avatar: string input1S;
}

const profile: UserProfile = {
  username: 'john_doe',
  avatar: null
};

console.log(profile.avatar);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Ошибка строгого режима

id: 40662_null_error_strict

В этом фрагменте TypeScript-кода допущена ошибка, связанная с использованием строгого режима проверки типов. Переменная объявлена с типом, который не позволяет присвоить ей значение null. Найдите строку с ошибкой и исправьте её, чтобы код стал корректным и компилировался без ошибок.

Найдите ошибку и исправьте
let price: number;
price = null;
console.log(price);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Проверка на null

id: 40662_null_highlight_parts_check

В представленном коде TypeScript найдите и выделите элементы, которые составляют условие проверки переменной на null. Для каждого выделенного фрагмента укажите, является ли он переменной, оператором сравнения или литералом null. Это упражнение поможет закрепить понимание работы с union-типами и сужением типов через проверки.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
function processValue(value: string | null): string {
  if ({{value~|~t1}} {{!==~|~t2}} {{null~|~t3}}) {
    return value;
  }
  return "";
}
Переменная
Литерал null
Оператор сравнения
Сообщения
Проверить
Показать подсказку

5. Результат проверки

id: 40662_null_predict_output

Рассмотрите код на TypeScript, который определяет две функции, принимающие параметр типа string | undefined. Одна функция использует проверку if, другая — оператор ?? (nullish coalescing). Код вызывает обе функции с аргументом undefined и выводит результаты. Выберите правильный вариант вывода.

Выберите правильный вариант ответа
function greetIf(name: string | undefined): string {
    if (name) {
        return name;
    } else {
        return "Guest";
    }
}

function greetNullish(name: string | undefined): string {
    return name ?? "Anonymous";
}

console.log(greetIf(undefined));
console.log(greetNullish(undefined));
Сообщения
Проверить
Показать подсказку

6. Безопасная функция

id: 40662_null_build_safe_function

Из предложенных строк соберите корректную TypeScript-функцию, которая принимает аргумент типа `number | null`, проверяет его на `null`, и если значение не равно `null` — возвращает квадрат этого числа, иначе возвращает 0. В решении должны использоваться только необходимые строки, лишние строки включать не нужно. Функция должна быть объявлена с явной типизацией параметра и возвращаемого значения.

Перетяните в правильном порядке строки из одного блока в другой
function safeSquare(value: number | null): number {
    if (value !== null) {
        return value * value;
    } else {
        return 0;
    }
}
    console.log(value);
    if (value === undefined) { return -1; }
    let result = 0;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Логика ветвления

id: 40662_null_select_fill_logic

В этом задании вам предстоит заполнить пропуски в коде TypeScript, который демонстрирует работу с union-типами, включающими null. Функция processString принимает аргумент, который может быть строкой или null, и возвращает строку. Вам нужно выбрать правильный тип аргумента, условие проверки на null и значение, возвращаемое в случае, если аргумент равен null. Используйте выпадающие списки для выбора подходящих вариантов.

Нужно правильно расставить в пропуски предложенные варианты
// Функция, обрабатывающая строку или null
function processString(input: input1S): string {
  // Проверяем, что input не равен null
  if (input2S) {
    // Если не null, возвращаем сам input
    return input;
  } else {
    // Иначе возвращаем строку по умолчанию
    return input3S;
  }
}

// Пример использования
const result1 = processString("Hello");
const result2 = processString(null);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Поток данных

id: 40662_null_analyze_flow

Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов выполнения программы. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как функция обрабатывает входное значение null и возвращает результат.

function processData(data: string | null): string {
  if (data !== null) {
    return data.toUpperCase();
  } else {
    return "Default Value";
  }
}

const output = processData(null);
console.log(output);
Расположите элементы в логичном порядке
Объявление функции processData с параметром типа string | null
Вызов функции processData с аргументом null
Вход в функцию, параметр data получает значение null
Присвоение возвращённого значения переменной output
Вывод значения output в консоль
Проверка условия (data !== null) — результат false
Выполнение ветки else: возврат строки "Default Value"
Сообщения
Проверить
Показать подсказку

9. Длина строки

id: 40662_null_give_result_len

Дан код на TypeScript, в котором определена функция, принимающая аргумент типа string | null. Функция использует тернарный оператор для проверки на null и возвращает длину строки или 0. Затем функция вызывается с конкретной строкой. Определите, какое числовое значение будет присвоено переменной result после выполнения кода. Введите одно число.

Что должно получиться?
function safeLength(s: string | null): number {
    return s !== null ? s.length : 0;
}

const result = safeLength("TypeScript");
Сообщения
Проверить
Показать подсказку

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

id: 40662_compiler

Этот пример показывает работу с Union типами, содержащими null и undefined - частый случай в реальных приложениях. Попробуйте передавать функции processUserData разные значения: null, undefined, строку, число. Что произойдет, если убрать проверки? Добавьте свою функцию валидации и поэкспериментируйте с TypeScript strict mode - увидите, как TypeScript помогает избежать ошибок 'undefined is not a function'.

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