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

Типобезопасные DTO и проверка во время выполнения

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

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет не результат JavaScript, а то, что TypeScript способен доказать до запуска.
Вопрос 1 из 30
Почему DTO не стоит объявлять тем же типом, что и внутренняя сущность?
TypeScript
interface UserEntity {
  id: UserId;
  createdAt: Date;
  passwordHash: string;
}

interface UserDto {
  id: string;
  createdAt: string;
}
Вопрос 2 из 30
Какой риск у Pick<UserEntity, 'id' | 'createdAt'> в публичном ответе?
TypeScript
type UserDto = Pick<UserEntity, "id" | "createdAt">;
Вопрос 3 из 30
Почему поле createdAt: Date неверно описывает JSON-ответ?
TypeScript
type UserResponse = { createdAt: Date };
const data = await fetch("/user").then(r => r.json()) as UserResponse;
Вопрос 4 из 30
Какие поля особенно опасно механически копировать из сущности в DTO?
Вопрос 5 из 30
Когда один DTO на чтение и запись становится слабой моделью?
Вопрос 6 из 30
Какой тип разумно присвоить результату response.json до проверки?
TypeScript
const raw = await response.json();
Вопрос 7 из 30
Почему typeof value === 'object' недостаточно?
TypeScript
function isObject(value: unknown): value is object {
  return typeof value === "object";
}
Вопрос 8 из 30
Что доказывает оператор in после базовой проверки объекта?
TypeScript
if (typeof value === "object" && value !== null && "id" in value) {
  // value.id
}
Вопрос 9 из 30
Почему unknown лучше object для произвольного входа парсера?
Вопрос 10 из 30
Как обращаться с массивом неизвестных элементов?
Вопрос 11 из 30
Что возвращает safeParse-подобный интерфейс схемы?
TypeScript
type ParseResult<T> =
  | { success: true; data: T }
  | { success: false; issues: readonly Issue[] };
Вопрос 12 из 30
Почему вывод типа из схемы снижает расхождение?
TypeScript
const UserSchema = schema.object({ id: schema.string() });
type UserDto = Infer<typeof UserSchema>;
Вопрос 13 из 30
Какой риск у схемы, которая молча удаляет неизвестные поля?
TypeScript
const parsed = UserSchema.parse(raw); // unknown keys are stripped
Вопрос 14 из 30
Когда парсер должен нормализовать данные, а не только проверять?
Вопрос 15 из 30
Где держать схемы входных данных?
Вопрос 16 из 30
Зачем преобразовывать ошибки валидатора в собственный тип?
TypeScript
type InputError = {
  path: readonly (string | number)[];
  code: "required" | "invalid_type" | "invalid_format";
  message: string;
};
Вопрос 17 из 30
Почему catch (error) следует рассматривать как unknown?
TypeScript
try {
  return schema.parse(raw);
} catch (error) {
  // ...
}
Вопрос 18 из 30
Как сохранить путь к вложенному полю при преобразовании?
TypeScript
issues.map(issue => ({
  path: issue.path,
  code: mapCode(issue.code),
  message: localize(issue)
}));
Вопрос 19 из 30
Какой HTTP-ответ лучше для ошибки проверки входа?
Вопрос 20 из 30
Когда собирать все ошибки, а когда прекращать на первой?
Вопрос 21 из 30
Что должен подтвердить типовой тест схемы UserSchema?
TypeScript
declare const UserSchema: { parse(value: unknown): UserDto };
declare const raw: unknown;
const user = UserSchema.parse(raw);
Вопрос 22 из 30
Какой отрицательный пример полезен для выходного DTO?
TypeScript
type UserResponse = { id: string; displayName: string; createdAt: string };
Вопрос 23 из 30
Почему type UserDto = z.infer<typeof UserSchema> не отменяет runtime-тестов схемы?
TypeScript
type UserDto = Infer<typeof UserSchema>;
Вопрос 24 из 30
Схема стала преобразовывать строковую дату в Date, но тип результата остался string. Как поймать рассогласование?
Вопрос 25 из 30
Какой набор фикстур лучше проверяет входной DTO?
Вопрос 26 из 30
Какой публичный тип ответа меньше связан с моделью базы данных?
TypeScript
export interface UserResponse {
  id: string;
  displayName: string;
  createdAt: string;
}
Вопрос 27 из 30
Какие поля здесь нельзя публиковать в UserResponse?
TypeScript
interface UserEntity {
  id: string; displayName: string; createdAt: Date;
  passwordHash: string; ormMetadata: object;
}
type UserResponse = Pick<UserEntity, keyof UserEntity>;
Вопрос 28 из 30
В API добавляется новый вариант validation_error с путями полей. Как лучше развить контракт?
TypeScript
type CreateUserResult =
 | { ok: true; user: UserResponse }
 | { ok: false; kind: "validation_error"; issues: readonly ValidationIssue[] }
 | { ok: false; kind: "conflict" };
Вопрос 29 из 30
Как проверить совместимость изменения DTO для внешнего клиента?
Вопрос 30 из 30
Какой признак говорит, что выведенный из схемы тип слишком сложен для публичного API?

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

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

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

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