Вопрос проверяет понимание discriminated union и проектирование типовой модели.
Общий тип пользователя удобно описывать через discriminated union. Для этого вводится общее поле-дискриминатор. По нему TypeScript понимает, с каким вариантом типа работает код. Такой подход безопасен и хорошо масштабируется. Он часто используется в реальных проектах.
Когда у сущности есть несколько чётко определённых вариантов, используется discriminated union.
Discriminated union — это union-тип, в котором все варианты имеют общее поле с литеральным значением.
interface BaseUser {
id: number;
type: "admin" | "user";
}
interface AdminUser extends BaseUser {
type: "admin";
permissions: string[];
}
interface RegularUser extends BaseUser {
type: "user";
email: string;
}
type User = AdminUser | RegularUser;
Такой подход:
упрощает сужение типов
исключает недопустимые поля
улучшает читаемость
хорошо масштабируется
Пример использования:
function getUserInfo(user: User) {
if (user.type === "admin") {
user.permissions;
}
}
Optional-поля:
усложняют проверки
допускают некорректные состояния
делают модель менее строгой
Discriminated union — лучший способ описывать общий тип для разных вариантов сущности. Он делает модель данных строгой, читаемой и безопасной.