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

Брендированные типы и доменные идентификаторы

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

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет не результат JavaScript, а то, что TypeScript способен доказать до запуска.
Вопрос 1 из 30
Почему две переменные структурно совместимы, хотя относятся к разным сущностям?
TypeScript
type UserId = string;
type OrderId = string;

let userId: UserId = "u-1";
const orderId: OrderId = "o-9";
userId = orderId;
Вопрос 2 из 30
Что именно отличает два интерфейса в этом примере?
TypeScript
interface UserRef { readonly value: string }
interface OrderRef { readonly value: string }

const order: OrderRef = { value: "o-1" };
const user: UserRef = order;
Вопрос 3 из 30
Какой приём создаёт различие, не добавляя обычное поле в runtime-объект?
TypeScript
declare const userIdBrand: unique symbol;
type UserId = string & { readonly [userIdBrand]: true };
Вопрос 4 из 30
Когда структурная совместимость полезнее номинальной?
Вопрос 5 из 30
Почему не стоит брендировать каждую строку в проекте?
Вопрос 6 из 30
Почему OrderId нельзя передать вместо UserId?
TypeScript
declare const userBrand: unique symbol;
declare const orderBrand: unique symbol;
type UserId = string & { readonly [userBrand]: "UserId" };
type OrderId = string & { readonly [orderBrand]: "OrderId" };

declare const orderId: OrderId;
function loadUser(id: UserId) {}
loadUser(orderId);
Вопрос 7 из 30
Какой недостаток у общедоступного текстового поля __brand?
TypeScript
type UserId = string & { readonly __brand: "UserId" };
Вопрос 8 из 30
Что получится у массива ids после map?
TypeScript
declare const brand: unique symbol;
type UserId = string & { readonly [brand]: true };
declare const ids: UserId[];

const normalized = ids.map(id => id.toLowerCase());
Вопрос 9 из 30
Как назвать бренд, чтобы он был полезен в диагностике?
Вопрос 10 из 30
Какая модель лучше для денежных величин в разных валютах?
Вопрос 11 из 30
Почему фабрика возвращает UserId | undefined?
TypeScript
declare const brand: unique symbol;
type UserId = string & { readonly [brand]: true };

function parseUserId(raw: string): UserId | undefined {
  return /^u-[0-9]+$/.test(raw) ? raw as UserId : undefined;
}
Вопрос 12 из 30
Какой дефект у этой фабрики?
TypeScript
type Positive = number & { readonly __brand: "Positive" };
function positive(value: number): Positive {
  return value as Positive;
}
Вопрос 13 из 30
Почему assert-функция может быть удобна на границе CLI?
TypeScript
function assertPort(value: number): asserts value is Port {
  if (!Number.isInteger(value) || value < 1 || value > 65535) {
    throw new RangeError("invalid port");
  }
}
Вопрос 14 из 30
Какой результат фабрики удобнее, если интерфейс должен показать причину отказа?
Вопрос 15 из 30
Где должны находиться небезопасные утверждения бренда?
Вопрос 16 из 30
Почему параметр raw должен быть unknown, а не UserId?
TypeScript
async function readUserId(response: Response): Promise<UserId> {
  const raw = await response.json();
  // ...
}
Вопрос 17 из 30
Что теряется после JSON.stringify/parse?
TypeScript
declare const id: UserId;
const restored = JSON.parse(JSON.stringify(id));
Вопрос 18 из 30
Почему функция repository.find принимает UserId, а не string?
TypeScript
interface UserRepository {
  find(id: UserId): Promise<User | undefined>;
}
Вопрос 19 из 30
Нужно ли экспортировать функцию unsafeUserId(raw: string): UserId из публичного пакета?
Вопрос 20 из 30
Как передать брендированное значение в SQL-драйвер, ожидающий string?
Вопрос 21 из 30
Какую гарантию должен удерживать типовой тест фабрики parseUserId?
TypeScript
declare const userIdBrand: unique symbol;
type UserId = string & { readonly [userIdBrand]: true };
declare function parseUserId(raw: string): UserId | undefined;
Вопрос 22 из 30
Какой отрицательный пример точнее всего проверяет раздельность доменных идентификаторов?
TypeScript
declare const userBrand: unique symbol;
declare const orderBrand: unique symbol;
type UserId = string & { readonly [userBrand]: true };
type OrderId = string & { readonly [orderBrand]: true };
declare function loadUser(id: UserId): void;
Вопрос 23 из 30
Почему после JSON.parse нельзя сразу считать поле id значением UserId?
TypeScript
declare const raw: unknown;
// raw получен из JSON.parse(responseText)
Вопрос 24 из 30
Фабрика идентификатора стала принимать строки без префикса usr_. Какой тест важнее всего обновить или восстановить?
Вопрос 25 из 30
Какой набор проверок лучше всего защищает функцию, принимающую UserId?
Вопрос 26 из 30
Какой публичный контракт оставляет реализации больше свободы?
TypeScript
export interface UserReader {
  find(id: UserId): Promise<UserSummary | undefined>;
}
Вопрос 27 из 30
Что в этом типе сильнее всего связывает потребителя с внутренней реализацией?
TypeScript
export interface UserView {
  id: UserId;
  displayName: string;
  ormEntity: object;
  cachePartition: number;
}
Вопрос 28 из 30
Формат идентификаторов меняется с usr_123 на UUID. Как безопаснее эволюционировать публичный API?
TypeScript
declare function parseUserId(raw: string): UserId | undefined;
declare function formatUserId(id: UserId): string;
Вопрос 29 из 30
Как проверить, что новая версия библиотеки не сломала потребителей UserId?
Вопрос 30 из 30
Какой признак показывает, что система брендов стала неудобной для потребителя?

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

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

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

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