TS TypeScript  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Исчерпывающая проверка вариантов

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

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет не результат JavaScript, а то, что TypeScript способен доказать до запуска.
Вопрос 1 из 30
Какое поле делает объединение удобным для безопасного сужения?
TypeScript
type Result =
  | { kind: "ok"; value: string }
  | { kind: "error"; message: string };
Вопрос 2 из 30
Почему payload доступен только в одной ветви?
TypeScript
type Event =
  | { type: "data"; payload: Uint8Array }
  | { type: "close"; code: number };

function handle(event: Event) {
  if (event.type === "data") {
    event.payload;
  }
}
Вопрос 3 из 30
Какой недостаток у модели с независимыми optional-полями?
TypeScript
type State = {
  status: "idle" | "loaded" | "failed";
  data?: string[];
  error?: Error;
};
Вопрос 4 из 30
Когда boolean-флаг хуже размеченного объединения?
Вопрос 5 из 30
Какой дискриминант выбрать для публичного протокола?
Вопрос 6 из 30
Зачем функция assertNever принимает never?
TypeScript
function assertNever(value: never): never {
  throw new Error(`Unexpected: ${String(value)}`);
}
Вопрос 7 из 30
Почему присваивание check: never не проходит?
TypeScript
type Mode = "read" | "write";
function run(mode: Mode) {
  if (mode === "read") return;
  const check: never = mode;
}
Вопрос 8 из 30
Какой тип у x после бесконечного цикла или безусловного throw в ветви?
TypeScript
function fail(message: string): never { throw new Error(message); }
const x = Math.random() > 0.5 ? "ok" : fail("bad");
Вопрос 9 из 30
Почему never полезен не только в assertNever?
Вопрос 10 из 30
Что означает функция с возвращаемым типом never?
Вопрос 11 из 30
Как сделать switch исчерпывающим?
TypeScript
type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; side: number };

function area(shape: Shape): number {
  switch (shape.kind) {
    case "circle": return Math.PI * shape.radius ** 2;
    case "square": return shape.side ** 2;
    default: return assertNever(shape);
  }
}
Вопрос 12 из 30
Почему default: throw new Error() без параметра слабее assertNever(shape)?
TypeScript
default:
  throw new Error("unknown shape");
Вопрос 13 из 30
Как избежать default и всё же заметить пропущенный вариант в функции, возвращающей string?
TypeScript
function label(state: State): string {
  switch (state.kind) {
    case "idle": return "Ожидание";
    case "ready": return "Готово";
  }
}
Вопрос 14 из 30
Когда таблица обработчиков лучше длинного switch?
Вопрос 15 из 30
Как проверить исчерпывающий switch в обзорe кода?
Вопрос 16 из 30
Что произойдёт после добавления pending?
TypeScript
type Status =
  | { kind: "ok"; value: string }
  | { kind: "error"; message: string }
  | { kind: "pending" };

function render(status: Status): string {
  switch (status.kind) {
    case "ok": return status.value;
    case "error": return status.message;
    default: return assertNever(status);
  }
}
Вопрос 17 из 30
Почему catch-all вариант { kind: string } разрушает сужение?
TypeScript
type Event =
  | { kind: "created"; id: string }
  | { kind: string; payload: unknown };
Вопрос 18 из 30
Как сохранить обратную совместимость при новом необязательном поле, не создавая новый вариант?
TypeScript
type Created = { kind: "created"; id: string; source?: "api" | "import" };
Вопрос 19 из 30
Закрытый union публикуется как API. Что считать потенциально несовместимым изменением?
Вопрос 20 из 30
Как проектировать протокол, где сервер может присылать новые неизвестные виды событий?
Вопрос 21 из 30
Что должен подтвердить типовой тест функции assertNever?
TypeScript
function assertNever(value: never): never {
  throw new Error(`Unexpected: ${String(value)}`);
}
Вопрос 22 из 30
Какой отрицательный пример лучше проверяет исчерпывающий switch?
TypeScript
type Shape =
 | { kind: "circle"; radius: number }
 | { kind: "square"; side: number }
 | { kind: "triangle"; base: number; height: number };
Вопрос 23 из 30
Почему даже исчерпывающий switch не защищает от произвольного JSON?
TypeScript
declare const raw: unknown;
// raw получен из JSON.parse(body)
Вопрос 24 из 30
После рефакторинга в switch появился общий default, возвращающий заглушку. Какой тест обнаружит потерю исчерпываемости?
Вопрос 25 из 30
Какой набор проверок нужен для функции, обрабатывающей Result union?
Вопрос 26 из 30
Какой публичный тип ошибки проще расширять контролируемо?
TypeScript
export type LoadError =
 | { kind: "not_found"; id: UserId }
 | { kind: "forbidden" }
 | { kind: "temporary"; retryAfterMs: number };
Вопрос 27 из 30
Что в этой модели является лишней утечкой внутреннего протокола?
TypeScript
export type PublicFailure = {
  kind: "temporary";
  retryAfterMs: number;
  internalStateCode: 17 | 23 | 41;
};
Вопрос 28 из 30
Сервер может прислать новый kind, которого старая версия клиента не знает. Какой подход устойчивее?
TypeScript
type KnownEvent =
 | { kind: "created"; id: string }
 | { kind: "deleted"; id: string };
Вопрос 29 из 30
Как проверить совместимость добавления нового варианта публичного union?
Вопрос 30 из 30
Какой признак говорит, что union-модель стала слишком трудной для сопровождения?

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

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

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

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