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

Сужение типов

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

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет не результат JavaScript, а то, что TypeScript способен доказать до запуска.
Вопрос 1 из 20
Какой тип имеет value в каждой ветви?
TypeScript
function show(value: string | number) {
  if (typeof value === "string") {
    return value.toUpperCase();
  }
  return value.toFixed(2);
}
Вопрос 2 из 20
Почему проверка typeof value === "object" недостаточна?
TypeScript
function read(value: object | null) {
  if (typeof value === "object") {
    return Object.keys(value);
  }
}
Вопрос 3 из 20
До какого типа сужается animal?
TypeScript
class Cat { meow() {} }
class Dog { bark() {} }
function speak(animal: Cat | Dog) {
  if (animal instanceof Cat) {
    animal.meow();
  }
}
Вопрос 4 из 20
Когда instanceof не подходит для проверки данных из JSON?
Вопрос 5 из 20
Почему сравнение typeof x === "array" никогда не сузит массив?
Вопрос 6 из 20
Какой тип имеет value в истинной ветви?
TypeScript
type File = { path: string; size: number };
type Folder = { path: string; children: string[] };
function inspect(value: File | Folder) {
  if ("children" in value) {
    return value.children.length;
  }
  return value.size;
}
Вопрос 7 из 20
Почему проверка поля kind особенно надёжна?
TypeScript
type Job =
  | { kind: "queued"; position: number }
  | { kind: "done"; result: string };
function render(job: Job) {
  if (job.kind === "done") return job.result;
  return job.position;
}
Вопрос 8 из 20
Почему hasOwn полезнее простого in в этом сценарии?
TypeScript
const settings = Object.create({ theme: "dark" });
if ("theme" in settings) {
  // свойство может прийти из прототипа
}
Вопрос 9 из 20
В union оба варианта имеют optional-поле value. Сузит ли проверка "value" in x до одного варианта?
Вопрос 10 из 20
Какой признак лучше выбрать для размеченного union?
Вопрос 11 из 20
Какой тип имеет input после проверки и раннего возврата?
TypeScript
function trim(input: string | null) {
  if (input === null) return "";
  return input.trim();
}
Вопрос 12 из 20
Почему сужение может потеряться внутри отложенного callback?
TypeScript
function use(value: { name?: string }) {
  if (value.name) {
    setTimeout(() => console.log(value.name.toUpperCase()), 0);
  }
}
Вопрос 13 из 20
Что произойдёт с типом value после присваивания?
TypeScript
let value: string | number = "42";
value = 42;
value.toFixed(0);
Вопрос 14 из 20
Почему сужение локальной const-переменной обычно устойчивее сужения изменяемого свойства объекта?
Вопрос 15 из 20
Функция проверила параметр, но затем вызвала другую функцию, которая может изменить объект. Что разумно сделать?
Вопрос 16 из 20
Почему default-ветка получает тип never?
TypeScript
type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; side: number };
function area(shape: Shape) {
  switch (shape.kind) {
    case "circle": return Math.PI * shape.radius ** 2;
    case "square": return shape.side ** 2;
    default: {
      const impossible: never = shape;
      return impossible;
    }
  }
}
Вопрос 17 из 20
Какой тип возвращает функция fail и почему он помогает анализу?
TypeScript
function fail(message: string): never {
  throw new Error(message);
}
function get(value: string | undefined) {
  return value ?? fail("missing");
}
Вопрос 18 из 20
Какой участок недостижим?
TypeScript
function parse(value: string | number) {
  if (typeof value === "string") return value.length;
  if (typeof value === "number") return value;
  return value;
}
Вопрос 19 из 20
Зачем оставлять assertNever в production-коде, если ветка должна быть недостижимой?
Вопрос 20 из 20
Что опасного в default, который молча возвращает пустой объект для неизвестного варианта?

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

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

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

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