TS TypeScript  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Пользовательские защитники типов

Вопросы требуют читать код, сопоставлять статические гарантии с поведением JavaScript и выбирать решение, которое не рассыплется при развитии проекта.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет не результат JavaScript, а то, что TypeScript способен доказать до запуска.
Вопрос 1 из 20
Какой тип имеет value после успешной проверки isString?
TypeScript
function isString(value: unknown): value is string {
  return typeof value === "string";
}
function upper(value: unknown) {
  if (isString(value)) return value.toUpperCase();
  return "";
}
Вопрос 2 из 20
Почему имя параметра в предикате должно совпадать с параметром функции?
TypeScript
function isUser(value: unknown): item is { id: string } {
  return true;
}
Вопрос 3 из 20
Какой результат даёт filter с предикатом?
TypeScript
function isDefined<T>(value: T | undefined): value is T {
  return value !== undefined;
}
const values = ["a", undefined, "b"].filter(isDefined);
Вопрос 4 из 20
Что делает пользовательский type guard надёжным?
Вопрос 5 из 20
Когда guard лучше простой локальной проверки typeof?
Вопрос 6 из 20
Что происходит после assertUser(value)?
TypeScript
function assertUser(value: unknown): asserts value is { id: string } {
  if (typeof value !== "object" || value === null || !("id" in value)) {
    throw new Error("Invalid user");
  }
}
function read(value: unknown) {
  assertUser(value);
  return value.id;
}
Вопрос 7 из 20
Какой недочёт есть в assertUser?
TypeScript
function assertUser(value: unknown): asserts value is { id: string } {
  if (typeof value !== "object" || value === null || !("id" in value)) {
    throw new Error("Invalid user");
  }
}
Вопрос 8 из 20
Чем asserts condition отличается от asserts value is T?
TypeScript
function invariant(condition: unknown): asserts condition {
  if (!condition) throw new Error("Invariant failed");
}
Вопрос 9 из 20
Когда assertion function уместнее предиката, возвращающего boolean?
Вопрос 10 из 20
Как тестировать assertion function?
Вопрос 11 из 20
Какая проверка действительно подтверждает объект User?
TypeScript
type User = { id: string; active: boolean };
function isUser(value: unknown): value is User {
  // выбрать условие
}
Вопрос 12 из 20
Почему Array.isArray недостаточно для number[]?
TypeScript
function isNumbers(value: unknown): value is number[] {
  return Array.isArray(value);
}
Вопрос 13 из 20
Как безопасно проверить вложенное поле?
TypeScript
type Payload = { meta: { requestId: string } };
function isPayload(value: unknown): value is Payload {
  // ...
}
Вопрос 14 из 20
Для крупного DTO с десятками полей ручной guard начал расходиться со схемой. Что разумно сделать?
Вопрос 15 из 20
Почему guard не должен изменять проверяемое значение ради успешного результата?
Вопрос 16 из 20
Почему этот guard опасен?
TypeScript
type Admin = { role: "admin"; permissions: string[] };
function isAdmin(value: unknown): value is Admin {
  return typeof value === "object" && value !== null && "role" in value;
}
Вопрос 17 из 20
Какой тест обнаружит ложную гарантию?
TypeScript
const candidate = { role: "admin", permissions: [1, 2] };
Вопрос 18 из 20
Что произойдёт, если guard всегда возвращает true?
TypeScript
function isDate(value: unknown): value is Date {
  return true;
}
const input: unknown = "not a date";
if (isDate(input)) input.getFullYear();
Вопрос 19 из 20
Как уменьшить вероятность ложного guard?
Вопрос 20 из 20
Guard из сторонней библиотеки утверждает слишком узкий тип. Как поступить?

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

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

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

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