Utility Type Required<T> — это противоположность Partial. Он делает все свойства переданного типа T обязательными, удаляя модификаторы необязательности (?).
Синтаксис: type RequiredUser = Required<PartialUser>;. Этот тип незаменим, когда у вас есть данные, которые могли быть неполными на предыдущем этапе (например, из формы), но для следующей операции (отправка на сервер) все поля должны быть заполнены.
Практика с Required на нашем интерактивном тренажере TypeScript поможет понять, как управлять обязательностью полей в объектах, что важно для разработки надёжных приложений.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Partial vs Required
В левой колонке перечислены названия utility types TypeScript, а в правой — их краткие описания. Сопоставьте каждый utility type с соответствующим описанием. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок описаний перемешан.
Partial<T>Required<T>Readonly<T>Pick<T, K>Omit<T, K>Record<K, V>2. Найди обязательные поля
Перед вами фрагмент кода на TypeScript, в котором объявлены несколько типов с использованием утилитного типа Required. Внимательно изучите код и определите, какие именно свойства в конечных типах являются обязательными (не могут быть undefined). Отметьте кликом только имена тех свойств, которые после всех преобразований становятся обязательными. Не отмечайте имена типов, ключевые слова, знаки вопроса или другие элементы синтаксиса.
type User = {
id?: number;
{{name~|~t1}}?: string;
email?: string;
};
type Product = {
{{id~|~t2}}: number;
title?: string;
{{price~|~t3}}?: number;
};
type RequiredUser = {{Required~|~t4}}<User>;
type RequiredProduct = Required<Product>;
// Пример использования
declare const user: RequiredUser;
declare const product: RequiredProduct;3. Где ошибка компиляции?
В этом фрагменте TypeScript-кода допущена одна ошибка компиляции, связанная с использованием утилитарного типа Required. Переменной типа Required
interface User { name?: string; age?: number;} const user: Required<User> = { name: "John" }; console.log(user.name);4. Логика преобразования типов
Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов выполнения программы. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как программа преобразует типы с помощью утилит Partial, Required и Omit.
interface User {
id: number;
name: string;
email?: string;
age?: number;
}
// Исходный объект с неполными данными
const partialUser: Partial<User> = {
name: "Alice",
age: 30
};
// Преобразование 1: сделать все свойства обязательными
const requiredUser: Required<Partial<User>> = partialUser as Required<Partial<User>>;
// Преобразование 2: удалить свойство 'age'
type UserWithoutAge = Omit<Required<Partial<User>>, 'age'>;
const { age, ...userWithoutAge } = requiredUser;
// Вывод результата
console.log(userWithoutAge);5. Заверши объявление
Дан код функции, которая должна гарантированно вернуть объект со всеми заполненными полями. В теле функции пропущено ключевое слово и название utility type. Заполните пропуски, чтобы функция возвращала объект, в котором все поля обязательны. Используйте знания о utility types в TypeScript.
interface User {
name?: string;
age?: number;
}
function completeUser(user: User): Required<User> {
return { ...user } input1S input2S;
}6. Предскажи результирующий тип
Проанализируйте приведённый код на TypeScript с использованием утилитарного типа Required в условном типе (conditional type). Определите, какой результирующий тип будет выведен TypeScript для типа Result. Выберите правильный вариант из предложенных.
type User = {
id?: number;
name?: string;
email?: string;
};
type MakeRequiredIfHasId<T> = T extends { id?: number } ? Required<T> : T;
type Result = MakeRequiredIfHasId<User>;7. Собери валидатор
Из предложенных строк соберите корректную реализацию функции validateAndRequire на TypeScript, которая принимает объект типа Partial
interface User { id: number; name: string; }function validateAndRequire(obj: Partial<User>): Required<User> { if (obj.id === undefined) { throw new Error('Missing id'); } if (obj.name === undefined) { throw new Error('Missing name'); } return obj as Required<User>;} console.log(obj); if (typeof obj.id !== 'number') { throw new Error('Id must be a number'); }