Required

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

Utility Type Required<T> — это противоположность Partial. Он делает все свойства переданного типа T обязательными, удаляя модификаторы необязательности (?).

Синтаксис: type RequiredUser = Required<PartialUser>;. Этот тип незаменим, когда у вас есть данные, которые могли быть неполными на предыдущем этапе (например, из формы), но для следующей операции (отправка на сервер) все поля должны быть заполнены.

Практика с Required на нашем интерактивном тренажере TypeScript поможет понять, как управлять обязательностью полей в объектах, что важно для разработки надёжных приложений.

Список тем

1. Partial vs Required

id: 40722_required_01_compare

В левой колонке перечислены названия utility types TypeScript, а в правой — их краткие описания. Сопоставьте каждый utility type с соответствующим описанием. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок описаний перемешан.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Partial<T>
Required<T>
Readonly<T>
Pick<T, K>
Omit<T, K>
Record<K, V>
Создаёт тип объекта, ключи которого типа K, а значения типа V
Делает все свойства типа T доступными только для чтения
Делает все свойства типа T обязательными
Делает все свойства типа T необязательными
Создаёт тип, исключая из T свойства, указанные в K
Выбирает из типа T только свойства, указанные в K
Сообщения
Проверить
Показать подсказку

2. Найди обязательные поля

id: 40722_required_02_click

Перед вами фрагмент кода на 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. Где ошибка компиляции?

id: 40722_required_03_error

В этом фрагменте TypeScript-кода допущена одна ошибка компиляции, связанная с использованием утилитарного типа Required. Переменной типа Required присваивается объект, в котором отсутствует одно обязательное свойство. Найдите строку с ошибкой и исправьте её, добавив недостающее свойство или изменив тип, чтобы код стал корректным.

Найдите ошибку и исправьте
interface User {
  name?: string;
  age?: number;
}
 
const user: Required<User> = { name: "John" };
 
console.log(user.name);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Логика преобразования типов

id: 40722_required_04_analyze

Проанализируйте 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);
Расположите элементы в логичном порядке
Определяется интерфейс User с обязательными (id, name) и необязательными (email, age) свойствами
Из объекта requiredUser удаляется свойство age, создавая объект userWithoutAge
Создаётся объект partialUser, содержащий только часть свойств (name, age), с типом Partial
С помощью утилиты Omit создаётся тип UserWithoutAge, исключающий свойство 'age' из Required>
В консоль выводится итоговый объект userWithoutAge
Тип Partial преобразуется в Required>, делая все свойства User обязательными
Сообщения
Проверить
Показать подсказку

5. Заверши объявление

id: 40722_required_05_replace

Дан код функции, которая должна гарантированно вернуть объект со всеми заполненными полями. В теле функции пропущено ключевое слово и название utility type. Заполните пропуски, чтобы функция возвращала объект, в котором все поля обязательны. Используйте знания о utility types в TypeScript.

Заполните пропуски
interface User {
  name?: string;
  age?: number;
}

function completeUser(user: User): Required<User> {
  return { ...user } input1S input2S;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Предскажи результирующий тип

id: 40722_required_06_predict

Проанализируйте приведённый код на 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. Собери валидатор

id: 40722_required_07_build

Из предложенных строк соберите корректную реализацию функции validateAndRequire на TypeScript, которая принимает объект типа Partial и возвращает его как Required, проверяя, что все поля (id и name) присутствуют. Функция должна выбрасывать ошибку, если какое-либо поле отсутствует. Интерфейс User определён с полями id: number и name: string. Не включайте в решение лишние строки (отладочный вывод или дополнительные проверки).

Перетяните в правильном порядке строки из одного блока в другой
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'); }
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

TypeScript: компиляция и запуск

id: 40722_compiler
TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру