Задача на TypeScript: описать тип пользователя с полями имя, фамилия, опциональное отчество и флаг наличия отчества. Написать функцию форматирования полного имени. Описать тип телефона, который всегда начинается с +7. Преобразовать тип с маленькой буквы в тип с заглавными буквами ключей без рефакторинга, используя возможности TypeScript.

Связь флага и отчества описывается discriminated union, префикс телефона — template literal type, а новые имена ключей — mapped type.

Короткий ответ

Что ответить на собеседовании

Связь флага и отчества описывается discriminated union, префикс телефона — template literal type, а новые имена ключей — mapped type.

Подробный разбор

Ответ с пояснениями

Связь флага и отчества описывается discriminated union, префикс телефона — template literal type, а новые имена ключей — mapped type.

Один из вариантов контракта:

type User = { firstName: string; lastName: string } & (
  | { hasMiddleName: true; middleName: string }
  | { hasMiddleName: false; middleName?: never }
);
function fullName(user: User): string {
  return [user.lastName, user.firstName,
    ...(user.hasMiddleName ? [user.middleName] : [])].join(' ');
}
type Phone = `+7${string}`;
type CapitalizedKeys<T> = {
  [K in keyof T as K extends string ? Capitalize<K> : K]: T[K]
};

Capitalize меняет первую букву, Uppercase — все буквы ключа. Это преобразует тип, не runtime-объект. Phone проверяет только префикс; цифры и длину проверяют отдельно во время выполнения.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее