Опциональные элементы в кортежах

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

Тренажер по TypeScript

Иногда структура данных подразумевает, что некоторые элементы могут отсутствовать. В TypeScript кортежи поддерживают опциональные элементы. Это делается с помощью знака вопроса ? после типа элемента.

Пример: [number, number?] описывает массив, где второй элемент может быть числом, а может отсутствовать. Это влияет на свойство length и на проверки типов при доступе к элементу.

В этом блоке мы рассмотрим визуализацию кода с опциональными кортежами. Вы научитесь правильно расставлять знаки вопроса (помните, обязательные элементы не могут идти после опциональных!) и обрабатывать ситуации, когда значение undefined. Проходите уроки и решайте тесты для закрепления материала.

Список тем

1. Синтаксис опциональности

id: 40641_tup_opt_replace_mark

В TypeScript кортежи (tuples) могут содержать опциональные элементы, которые обозначаются специальным синтаксисом. Дан код объявления типа кортежа. Вставьте знак `?` в правильное место, чтобы сделать последний элемент кортежа опциональным. Это позволит создавать экземпляры кортежа как с этим элементом, так и без него, сохраняя строгую типизацию остальных позиций.

Заполните пропуски
type UserProfile = [
  string,
  number,
  boolean input1S
];
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Присваивание значений

id: 40641_tup_opt_select_assign

В этом задании вам нужно заполнить пропуски в коде TypeScript, чтобы продемонстрировать валидные присваивания для кортежа с опциональным элементом. Тип кортежа `[string, number?]` означает, что первый элемент — строка, а второй (опциональный) — число. Выберите из списка вариантов присваивание с одним элементом (только строка) и присваивание с двумя элементами (строка и число). Обратите внимание на синтаксис литералов массивов и типы элементов.

Нужно правильно расставить в пропуски предложенные варианты
let myTuple: [string, number?];
// Присваивание с одним элементом
myTuple = input1S;
// Присваивание с двумя элементами
myTuple = input2S;
// Выводим оба элемента
console.log(myTuple[0]);
console.log(myTuple[1]);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Ошибка позиции

id: 40641_tup_opt_error_pos

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

Найдите ошибку и исправьте
let personInfo: [string?, number];
personInfo = ["Alice", 30];
console.log(personInfo[0]);
console.log(personInfo[1]);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Длина кортежа

id: 40641_tup_opt_predict_len

Проанализируйте приведённый фрагмент кода на TypeScript, определяющий кортеж с опциональным элементом. Определите, какие длины может иметь массив, соответствующий этому типу. Выберите правильный вариант из предложенных.

Выберите правильный вариант ответа
type OptionalTuple = [number, number?];
const tuple1: OptionalTuple = [42];
const tuple2: OptionalTuple = [42, 24];
// const tuple3: OptionalTuple = []; // Ошибка: слишком мало элементов
// const tuple4: OptionalTuple = [42, 24, 100]; // Ошибка: слишком много элементов
Сообщения
Проверить
Показать подсказку

5. Проверка существования

id: 40641_tup_opt_analyze_check

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

let person: [string, number?] = ["Alex"];
let age = person[1];
if (age !== undefined) {
  console.log(`Age: ${age}`);
} else {
  console.log("Age not provided");
}
Расположите элементы в логичном порядке
Проверка, не равен ли полученный элемент undefined (ветвление if/else)
Получение второго элемента кортежа по индексу 1 (опциональный элемент) и сохранение в переменную age
Вывод сообщения об отсутствии возраста, если значение undefined (ветка else)
Вывод сообщения с возрастом, если значение определено (ветка if)
Объявление кортежа person с опциональным вторым элементом и инициализация только первым элементом
Сообщения
Проверить
Показать подсказку

6. Выбор валидных строк

id: 40641_tup_opt_click_valid

Дано определение типа кортежа с опциональными элементами. Ниже приведены 10 попыток присвоения переменной этого типа. Внимательно изучите код и отметьте только те строки, которые не вызовут ошибок компиляции TypeScript. Не отмечайте строки, которые приведут к ошибке типизации или нарушению структуры кортежа.

Кликните по всем фрагментам, которые подходят под условие задания.
type MyTuple = [string, number?, boolean?];

{{let a: MyTuple = ["hello"];~|~t1}}
{{let b: MyTuple = [123];~|~t2}}
{{let c: MyTuple = ["hello", 42];~|~t3}}
{{let d: MyTuple = ["hello", "world"];~|~t4}}
{{let e: MyTuple = ["hello", 42, true];~|~t5}}
{{let f: MyTuple = ["hello", undefined, true];~|~t6}}
{{let g: MyTuple = [];~|~t7}}
{{let h: MyTuple = ["hello", 42, "extra"];~|~t8}}
{{let i: MyTuple = ["hello", 42, true, "extra"];~|~t9}}
{{let j: MyTuple = ["hello", undefined];~|~t10}}
Сообщения
Проверить
Показать подсказку

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

id: 40641_compiler

Этот пример показывает, как в TypeScript работают кортежи с опциональными элементами и почему их удобно использовать для «необязательных» данных. Попробуйте менять входные кортежи: уберите город, добавьте его, подставьте пустую строку или другие значения и посмотрите, как меняется вывод. Поэкспериментируйте с функцией formatUser: добавьте ещё один опциональный элемент (например, возраст) и обновите форматирование. Также попробуйте раскомментировать «неправильные» строки внизу, чтобы увидеть, какие ошибки ловит компилятор и где легко ошибиться с обычным массивом.

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