Основы Conditional Types

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

Тренажер по TypeScript

Conditional Types (условные типы) — это продвинутая возможность TypeScript, позволяющая создавать типы, которые выбирают одну из двух возможных структур на основе условия. Синтаксис похож на тернарный оператор: T extends U ? X : Y. Если тип T можно присвоить типу U, то результатом будет тип X, иначе — Y.

Условные типы открывают дорогу для создания невероятно гибких и выразительных типов, которые адаптируются под входные данные. Они часто используются вместе с generic-параметрами в типах-утилитах (как встроенных, так и пользовательских). Например, они могут определить, является ли переданный тип массивом, чтобы вернуть тип его элементов.

Изучение conditional types кажется сложным, но наш практический тренажер разбивает его на понятные шаги. Вы будете решать задания, где нужно предсказать результат условного типа для конкретного входного типа или собрать условный тип из частей. Такие тренировки без сухой теории и с визуализацией кода помогают глубоко понять механику работы. Этот онлайн-урок TypeScript бесплатно даст вам инструмент для профессиональной разработки сложных типовых систем.

Список тем

1. Дополни условие типа

id: 40751_ts_cond_01

В этом задании вам предстоит дополнить условие в условном типе TypeScript. Условные типы (Conditional Types) позволяют выбирать один из двух типов на основе условия, заданного через `extends`. Вам дан тип `IsString`, который должен проверять, является ли обобщённый тип `T` строковым. Если `T` — это `string`, тип должен возвращать `true`, иначе — `false`. Впишите недостающую часть условия (после ключевого слова `extends`) в отмеченном месте, чтобы тип работал корректно.

Заполните пропуски
// Этот тип проверяет, является ли T строковым типом
 type IsString<T> = T extends input1S ? true : false;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Построй условный тип

id: 40751_ts_cond_02

Перед вами перемешанные части условного типа TypeScript. Условный тип позволяет выбирать один из двух типов на основе условия, которое проверяет, удовлетворяет ли один тип другому. Соберите из этих частей корректный синтаксис условного типа, который проверяет, является ли тип T строкой (string). Если да, то результатом будет сам тип T, иначе — тип never. Расставьте строки в правильном порядке сверху вниз, чтобы получился валидный TypeScript-код.

Расставьте строки в правильном порядке
extends string
? T
T
: never
Сообщения
Проверить
Показать подсказку

3. Выбери результирующий тип

id: 40751_ts_cond_03

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

Нужно правильно расставить в пропуски предложенные варианты
type Type1<T> = T extends string ? string : number;
type Test1 = Type1<"abc">; // Результат: input1S

type Type2<T> = T extends number ? number : never;
type Test2 = Type2<boolean>; // Результат: input2S

type Type3<T> = T extends any[] ? T[number] : T;
type Test3 = Type3<string[]>; // Результат: input3S
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Сопоставь условие и результат

id: 40751_ts_cond_04

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
T extends string ? T : never
T extends (infer U)[] ? U : never
T extends Promise<infer R> ? R : never
T extends { length: number } ? number : never
T extends null | undefined ? never : T
R
number
T
U
T
Сообщения
Проверить
Показать подсказку

5. Какой тип получит переменная?

id: 40751_ts_cond_05

Проанализируйте объявление условного типа Check и его использование для определения типов переменных. Исходя из логики условного типа, определите, какой конкретный тип будет присвоен переменной d в данном фрагменте кода TypeScript.

Выберите правильный вариант ответа
type Check<T> = T extends string | number ? T : boolean;

let a: Check<string>;   // тип: string
let b: Check<number>;   // тип: number
let c: Check<boolean>;  // тип: boolean
let d: Check<string | number>; // тип: ?
Сообщения
Проверить
Показать подсказку

6. Найди все условные типы

id: 40751_ts_cond_06

Внимательно изучите приведённый ниже код на TypeScript. В нём содержатся объявления типов (ключевое слово `type`). Ваша задача — найти и отметить только те объявления, которые представляют собой условные типы. Условный тип в TypeScript использует синтаксис с вопросительным знаком и двоеточием (`? :`). Не отмечайте объявления, которые не содержат условных выражений.

Кликните по всем фрагментам, которые подходят под условие задания.
{{type IsString<T> = T extends string ? true : false;~|~t1}}
{{type MyNumber = number;~|~t2}}
{{type Status = 'active' | 'inactive';~|~t3}}
{{type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;~|~t4}}
{{type User = { name: string; age: number };~|~t5}}
{{type IsArray<T> = T extends any[] ? true : false;~|~t6}}
{{type Flatten<T> = T extends (infer U)[] ? U : T;~|~t7}}
Сообщения
Проверить
Показать подсказку

7. Вычисли условный тип

id: 40751_ts_cond_07

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

type Unwrap<T> = T extends Promise<infer U> 
  ? (U extends Array<infer V> ? V[] : U) 
  : T;

// Вычисление для конкретного типа
type Result = Unwrap<Promise<string[]>>;
Расположите элементы в логичном порядке
Проверка внутреннего условия: U extends Array<infer V> — истина
Извлечение типа V = string с помощью infer
Извлечение типа U = string[] с помощью infer
Проверка внешнего условия: T extends Promise<infer U> — истина
Возврат результата: тип string[] (массив строк)
Задан входной тип: T = Promise<string[]>
Сообщения
Проверить
Показать подсказку

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

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