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

Шаблонные строковые типы

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

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет не результат JavaScript, а то, что TypeScript способен доказать до запуска.
Вопрос 1 из 25
Какой union создаёт EventName?
TypeScript
type Field = "name" | "age";
type EventName = `${Field}Changed`;
Вопрос 2 из 25
Что получится из комбинации двух unions?
TypeScript
type Lang = "ru" | "en";
type Section = "home" | "profile";
type Key = `${Lang}.${Section}`;
Вопрос 3 из 25
Как ограничить строку префиксом user:?
TypeScript
type UserKey = `user:${string}`;
Вопрос 4 из 25
Когда template literal type особенно полезен?
Вопрос 5 из 25
Какой риск у декартова произведения больших unions?
Вопрос 6 из 25
Какие типы получатся для A и B после строковых преобразований?
TypeScript
type A = Uppercase<"getUser">;
type B = Capitalize<"profile">;
Вопрос 7 из 25
Какой тип получает NameGetter?
TypeScript
type Getter<K extends string> = `get${Capitalize<K>}`;
type NameGetter = Getter<"name">;
Вопрос 8 из 25
Почему Lowercase<string> остаётся string?
TypeScript
type Lower = Lowercase<string>;
Вопрос 9 из 25
Почему регистр в типах не гарантирует локалезависимое преобразование строки?
Вопрос 10 из 25
Когда преобразование регистра в публичных ключах ухудшает API?
Вопрос 11 из 25
Какие обработчики создаёт тип PropEvents?
TypeScript
type PropEvents<T> = {
  [K in keyof T as `on${Capitalize<string & K>}Changed`]:
    (value: T[K]) => void;
};
type UserEvents = PropEvents<{ name: string; age: number }>;
Вопрос 12 из 25
Какой тип получает F?
TypeScript
type FieldOf<E> = E extends `${infer K}Changed` ? K : never;
type F = FieldOf<"nameChanged">;
Вопрос 13 из 25
Почему строка onAgeChanged связана с number?
TypeScript
type Model = { name: string; age: number };
type Watcher<T> = {
  on<K extends keyof T & string>(event: `${K}Changed`, cb: (value: T[K]) => void): void;
};
Вопрос 14 из 25
Что проверить при добавлении symbol-ключей в Model?
Вопрос 15 из 25
Когда event API из шаблонных имён хуже явного объекта событий?
Вопрос 16 из 25
В показанном фрагменте что допускает тип Route?
TypeScript
type Route = `/users/${number}`;
Вопрос 17 из 25
Что произойдёт с присваиванием color?
TypeScript
type Hex = `#${string}`;
const color: Hex = "red";
Вопрос 18 из 25
Какой контракт безопаснее для идентификатора заказа из внешнего ввода?
TypeScript
type OrderId = `ord_${string}`;
function load(id: OrderId) {}
Вопрос 19 из 25
Почему `date_${number}-${number}-${number}` не гарантирует реальную дату?
Вопрос 20 из 25
Когда лучше брендированный string, а не один template literal type?
Вопрос 21 из 25
Какой литерал должен быть допустим для типа EventName<"user">?
TypeScript
type EventName<T extends string> = `${T}:changed`;
type UserEvent = EventName<"user">;
Вопрос 22 из 25
Какой маршрут должен быть отклонён типом `/${string}/${number}`?
TypeScript
type Route = `/${string}/${number}`;
declare function navigate(route: Route): void;
Вопрос 23 из 25
Почему одного примера Lowercase<"ADMIN"> недостаточно для проверки преобразования регистра?
Вопрос 24 из 25
После расширения набора событий шаблонный тип породил слишком большой union. Что измерять и проверять?
Вопрос 25 из 25
Как защитить связь между именем события и типом payload?

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

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

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

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