Литеральные Union типы

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

Тренажер по TypeScript

Объединение литеральных типов (Literal Union Types) — это способ ограничить переменную набором конкретных значений. Вместо того чтобы разрешать любую строку (string), вы можете разрешить, например, только 'start' | 'stop' | 'pause'.

Синтаксис использует оператор вертикальной черты | для перечисления допустимых литералов. Это отлично подходит для описания состояний, режимов работы, вариантов сортировки и конфигурационных настроек. TypeScript будет следить за тем, чтобы вы не присвоили значение, которого нет в списке, и подскажет возможные варианты в редакторе.

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

Список тем

1. Оператор объединения

id: 40668_ts_lit_union_replace_01

В этом задании вы научитесь создавать union-тип из строковых литералов с помощью оператора объединения |. Заполните пропуски, чтобы тип Direction мог принимать только четыре конкретных значения: "up", "down", "left" и "right". Используйте строковые литералы и соединяйте их символом вертикальной черты |. Пропуски расположены так, чтобы вы отработали именно синтаксис объединения литеральных типов в TypeScript.

Заполните пропуски
type Direction = input1S | input2S | input3S | input4S;

// Пример использования — порядок значений здесь подсказывает ожидаемый порядок в типе выше
const move: Direction = "up"; // должно быть разрешено

// Эти строки должны вызывать ошибку компиляции, если тип объявлен верно:
// const wrong: Direction = "forward";
// const wrong2: Direction = 42;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Валидные значения

id: 40668_ts_lit_union_compare_02

Сопоставьте каждое значение из левой колонки с соответствующей категорией в правой колонке: является ли оно валидным значением для типа `Align = 'left' | 'right' | 'center'` или нет. Обратите внимание, что в правой колонке несколько элементов имеют одинаковые подписи, поэтому правильных комбинаций сопоставления несколько.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
'left'
'right'
'center'
'top'
'bottom'
валидное значение
валидное значение
невалидное значение
невалидное значение
валидное значение
Сообщения
Проверить
Показать подсказку

3. Светофор

id: 40668_ts_lit_union_build_03

Из предложенных строк соберите корректную TypeScript-программу, которая определяет тип TrafficLight как объединение литеральных строковых значений 'red', 'yellow', 'green', объявляет переменную этого типа, присваивает ей значение 'red' и выводит это значение в консоль. Некоторые строки являются лишними и не должны входить в итоговое решение.

Перетяните в правильном порядке строки из одного блока в другой
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;
light = 'red';
console.log(light);
let light: string;
light = 'blue';
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Опечатка в значении

id: 40668_ts_lit_union_error_04

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

Найдите ошибку и исправьте
function setTransition(easing: 'ease-in' | 'ease-out') {
    console.log(`Transition set to ${easing}`);
}
setTransition('easein');
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Составные части Union

id: 40668_ts_lit_union_click_05

Перед вами фрагмент кода на TypeScript, содержащий определение сложного типа. Внимательно изучите объявление типа `ExtendedColor`. Ваша задача — выделить кликом все строковые литералы, которые непосредственно входят в это объединение (union type). Не отмечайте строковые литералы в других частях кода (например, в вызовах функции) или другие элементы синтаксиса.

Кликните по всем фрагментам, которые подходят под условие задания.
// Определение типа для цветов
type ExtendedColor = {{"red"~|~t1}} | {{"green"~|~t2}} | {{"blue"~|~t3}} | {{"yellow"~|~t4}} | {{"cyan"~|~t5}} | {{"magenta"~|~t6}};

// Функция для установки цвета
function setColor(color: ExtendedColor): void {
    console.log(`Цвет установлен: ${color}`);
}

// Примеры вызова
setColor({{"red"~|~t7}});
setColor({{"yellow"~|~t8}});
// setColor("black"); // Ошибка: "black" не допустим
Сообщения
Проверить
Показать подсказку

6. Аргументы функции

id: 40668_ts_lit_union_select_fill_06

В этом задании вам предстоит заполнить пропуски в коде TypeScript, чтобы корректно вызвать функцию настройки стиля. Функция принимает два аргумента: цвет (литеральный тип 'red' | 'blue') и размер (литеральный тип 'small' | 'large'). Используя выпадающие списки, выберите допустимые комбинации литералов, которые соответствуют объявленным типам. Обратите внимание, что аргументы должны быть именно строковыми литералами, а не произвольными строками.

Нужно правильно расставить в пропуски предложенные варианты
type Color = 'red' | 'blue';
type Size = 'small' | 'large';

function setStyle(color: Color, size: Size): void {
  console.log(`Style: color=${color}, size=${size}`);
}

// Вызов функции с допустимыми аргументами
setStyle(input1S, input2S);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. От типа к использованию

id: 40668_ts_lit_union_sequencing_07

Перед вами строки TypeScript-кода, связанные с использованием литеральных union-типов. Они перемешаны. Расставьте строки в правильном порядке, чтобы получилась корректная программа: сначала объявление литерального union-типа, затем объявление функции, принимающей этот тип, и, наконец, вызов функции с корректным литеральным значением. Программа должна компилироваться без ошибок и выводить сообщение в консоль.

Расставьте строки в правильном порядке
function move(direction: Direction) {
}
    console.log(`Moving to ${direction}`);
move("north");
type Direction = "north" | "south" | "east" | "west";
Сообщения
Проверить
Показать подсказку

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

id: 40668_compiler

Погрузитесь в мир строгих ограничений с Литеральными Union типами! В этом примере мы создаем систему настройки UI-компонентов, где значения могут быть только строго определенными строками. Попробуйте добавить новый размер, например 'xl', в определение типа и посмотрите, как TypeScript сразу потребует обновить логику. Экспериментируйте с параметрами: что произойдет, если передать случайную строку? Это лучший способ защитить ваш код от опечаток и сделать его самодокументированным.

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