Связь флага и отчества описывается discriminated union, префикс телефона — template literal type, а новые имена ключей — mapped type.
Задача на TypeScript: описать тип пользователя с полями имя, фамилия, опциональное отчество и флаг наличия отчества. Написать функцию форматирования полного имени. Описать тип телефона, который всегда начинается с +7. Преобразовать тип с маленькой буквы в тип с заглавными буквами ключей без рефакторинга, используя возможности TypeScript.
Связь флага и отчества описывается 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 проверяет только префикс; цифры и длину проверяют отдельно во время выполнения.