TS TypeScript  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Условные типы

Разбирает тему «Условные типы» на практических сценариях: поиск дефектов, сравнение решений и оценка последствий. Вопросы требуют читать код, сопоставлять статические гарантии с поведением JavaScript и выбирать решение, которое не рассыплется при развитии проекта.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет не результат JavaScript, а то, что TypeScript способен доказать до запуска.
Вопрос 1 из 25
Какие типы получают A и B?
TypeScript
type IsString<T> = T extends string ? true : false;
type A = IsString<string>;
type B = IsString<number>;
Вопрос 2 из 25
Что вернёт Flatten<number[]>?
TypeScript
type Flatten<T> = T extends readonly (infer Item)[] ? Item : T;
type Value = Flatten<number[]>;
Вопрос 3 из 25
Почему T extends null не является runtime-проверкой?
TypeScript
type RemoveNull<T> = T extends null ? never : T;
Вопрос 4 из 25
Когда conditional type оправдан?
Вопрос 5 из 25
Почему сложный conditional стоит сопровождать примерами?
Вопрос 6 из 25
Какой результат у ToArray<string | number>?
TypeScript
type ToArray<T> = T extends unknown ? T[] : never;
type Result = ToArray<string | number>;
Вопрос 7 из 25
Как отключить distributivity?
TypeScript
type ToArrayNonDist<T> = [T] extends [unknown] ? T[] : never;
type Result = ToArrayNonDist<string | number>;
Вопрос 8 из 25
Какой тип получает R?
TypeScript
type MyExclude<T, U> = T extends U ? never : T;
type R = MyExclude<"a" | "b" | 1, string>;
Вопрос 9 из 25
Когда distributivity неожиданно меняет смысл?
Вопрос 10 из 25
Почему never исчезает из результирующего union?
Вопрос 11 из 25
Какой тип извлечёт Return<T>?
TypeScript
type Return<T> = T extends (...args: any[]) => infer R ? R : never;
type R = Return<(id: string) => Promise<number>>;
Вопрос 12 из 25
Какой тип получает Value?
TypeScript
type UnwrapPromise<T> = T extends Promise<infer V> ? V : T;
type Value = UnwrapPromise<Promise<{ id: string }>>;
Вопрос 13 из 25
В показанном фрагменте что извлечёт First<T>?
TypeScript
type First<T> = T extends readonly [infer H, ...unknown[]] ? H : never;
type A = First<[string, number]>;
type B = First<[]>;
Вопрос 14 из 25
Почему имя infer-параметра должно отражать роль?
Вопрос 15 из 25
Когда встроенный Awaited<T> лучше самописного UnwrapPromise?
Вопрос 16 из 25
Какой тип вычислит DeepReadonly для массива?
TypeScript
type DeepReadonly<T> =
  T extends (...args: any[]) => any ? T :
  T extends readonly (infer U)[] ? readonly DeepReadonly<U>[] :
  T extends object ? { readonly [K in keyof T]: DeepReadonly<T[K]> } : T;
Вопрос 17 из 25
Зачем нужен базовый случай в рекурсивном типе?
TypeScript
type UnwrapArray<T> = T extends readonly (infer U)[] ? UnwrapArray<U> : T;
Вопрос 18 из 25
Какой результат у UnwrapArray<number[][]>?
TypeScript
type UnwrapArray<T> = T extends readonly (infer U)[] ? UnwrapArray<U> : T;
type R = UnwrapArray<number[][]>;
Вопрос 19 из 25
Какой риск у глубоко рекурсивных conditional-типа?
Вопрос 20 из 25
Когда рекурсивный тип не стоит использовать?
Вопрос 21 из 25
Какой ожидаемый тип нужно зафиксировать, чтобы тест заметил потерю распределяемости условного типа?
TypeScript
type ToArray<T> = T extends unknown ? T[] : never;
type Result = ToArray<string | number>;
Вопрос 22 из 25
Какой пример должен остаться ошибочным для типа MessageOf<T>?
TypeScript
type MessageOf<T> = T extends { message: infer M } ? M : never;
Вопрос 23 из 25
Почему проверка только одного члена union недостаточна для рекурсивного условного типа?
Вопрос 24 из 25
После оптимизации DeepReadonly<T> перестал сохранять кортежи и превращает их в обычные массивы. Что добавить в тест?
Вопрос 25 из 25
Как безопаснее проверять условный тип, который для неподдерживаемого входа возвращает never?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу