Extract

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

Тренажер по TypeScript

В этом уроке мы познакомимся с Utility Type Extract<T, U>. Это зеркальное отражение типа Exclude. Если Exclude «вычитает» типы, то Extract, наоборот, «оставляет» только те типы из объединения T, которые присутствуют (являются подтипом) в U.

Синтаксис: type Result = Extract<SourceUnion, Filter>.

Зачем это нужно?
Это полезно для поиска общих элементов между двумя типами или для фильтрации union-типов, чтобы оставить только определенное подмножество (например, выделить из списка всех событий только события мыши, если они имеют общую базу).

  • Оставляет общие типы.
  • Удаляет всё, что НЕ подходит под условие U.

Выполните задания, чтобы понять принцип работы «пересечения» типов.

Список тем

1. Результат извлечения

id: 40729_extr_01_predict

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

Выберите правильный вариант ответа
type A = 'admin' | 'user' | 'guest' | 'moderator';
type B = 'user' | 'moderator' | 'editor';
type C = Extract<A, B>;
Сообщения
Проверить
Показать подсказку

2. Синтаксис Extract

id: 40729_extr_02_replace

В этом задании вам нужно использовать Utility Type `Extract` для извлечения определённых типов из объединения (union). Дополните код, вставив пропущенные элементы: ключевое слово `Extract` и закрывающую угловую скобку дженерика. После правильного заполнения тип `Pet` должен быть равен `'cat' | 'dog'`.

Заполните пропуски
type Animal = 'cat' | 'dog' | 'bird';
type Pet = input1S<Animal, 'cat' | 'dog'input2S; // "cat" | "dog"
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Визуализация пересечения

id: 40729_extr_03_click

Перед вами фрагмент кода на TypeScript, демонстрирующий использование Utility Type Extract. Исходный union-тип состоит из пяти элементов. Внимательно изучите код и условие применения Extract. Ваша задача — кликнуть на те элементы исходного union-типа (первая строка), которые останутся в результате его работы. Не отмечайте элементы из второго аргумента Extract (вторая строка) и не отмечайте элементы, которые не входят в пересечение.

Кликните по всем фрагментам, которые подходят под условие задания.
type Original = {{'string'~|~t1}} | {{'number'~|~t2}} | {{'boolean'~|~t3}} | {{'null'~|~t4}} | {{'undefined'~|~t5}};
type Extracted = Extract;
Сообщения
Проверить
Показать подсказку

4. Фильтрация событий

id: 40729_extr_04_build

Из предложенных строк соберите корректную TypeScript-программу, которая создаёт тип `MouseEvents` из общего списка событий, используя Utility Type `Extract`. Программа должна определить тип событий мыши, функцию для обработки такого события и вызвать её с аргументом 'click'. Лишние строки, связанные с событиями клавиатуры, в решение включать не нужно.

Перетяните в правильном порядке строки из одного блока в другой
type Event = 'click' | 'dblclick' | 'mousemove' | 'keydown' | 'keyup';
type MouseEvents = Extract<Event, 'click' | 'dblclick' | 'mousemove'>;
function handleMouseEvent(event: MouseEvents) {
    console.log(event);
}
handleMouseEvent('click');
type KeyboardEvents = Extract<Event, 'keydown' | 'keyup'>;
const x: Event = 'keydown';
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Выбор фильтра

id: 40729_extr_05_select

В данном задании вам предстоит использовать утилитный тип TypeScript Extract для фильтрации union-типа. В коде ниже объявлен тип MyUnion, представляющий собой объединение string, number и boolean. С помощью Extract необходимо получить тип, содержащий только number. Для этого заполните пропуск в коде, выбрав подходящий тип из выпадающего списка. Обратите внимание на синтаксис использования Extract и на то, какой тип должен быть извлечен.

Нужно правильно расставить в пропуски предложенные варианты
type MyUnion = string | number | boolean;
type OnlyNumber = Extract<MyUnion, input1S>;
const num: OnlyNumber = 100;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Extract vs Exclude

id: 40729_extr_06_compare

Сопоставьте выражения, использующие утилиты типов `Extract` и `Exclude`, с результирующими типами. В левой колонке приведены примеры использования этих утилит, а в правой — возможные результирующие типы. Обратите внимание, что оба утилитных типа работают с объединениями (union types), но `Extract` извлекает общие части, а `Exclude` — исключает. Для каждого выражения слева выберите соответствующий тип справа.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Extract<'a' | 'b' | 'c', 'a' | 'b'>
Extract<'a' | 'b' | 'c', 'b' | 'c' | 'd'>
Exclude<'a' | 'b' | 'c', 'a' | 'b'>
Exclude<'a' | 'b' | 'c', 'b' | 'c' | 'd'>
'b' | 'c'
'a' | 'b'
'a'
'c'
Сообщения
Проверить
Показать подсказку

7. Ошибка в логике

id: 40729_extr_07_error

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

Найдите ошибку и исправьте
// Определяем union-тип
type AllTypes = string | number | boolean;
// Извлекаем только строки
type StringsOnly = Extract<AllTypes, number>;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

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

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