Omit

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

Тренажер по TypeScript

Утилита Omit<T, K> — это мощный инструмент в TypeScript для создания новых типов на основе существующих путем исключения определенных свойств. Это полная противоположность Pick. Представьте, что у вас есть интерфейс User с полями id, name и password, но для отображения профиля вам нужен тип без пароля. Вместо дублирования кода вы используете Omit<User, 'password'>.

Синтаксис позволяет исключать как одно свойство, так и несколько, используя объединение строк (Union Types), например 'id' | 'createdAt'. Эти уроки и примеры помогут вам понять, как эффективно использовать Omit для сокращения бойлерплейта и повышения поддерживаемости кода. Практические задания направлены на отработку синтаксиса и понимание логики исключения полей.

Список тем

1. Исключение одного поля

id: 40725_ts_omit_01_basic

В этом задании вам предстоит поработать с утилитарным типом Omit в TypeScript. Дан интерфейс, описывающий объект пользователя, и тип, созданный с помощью Omit, который исключает одно из полей исходного интерфейса. Ваша задача — определить, какое именно поле было исключено, и вписать его название в указанное место, чтобы объявленный тип соответствовал результату применения Omit. Обратите внимание на структуру кода и используемые типы.

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

type UserWithoutField = Omit<User, input1S>;

// UserWithoutField должен быть эквивалентен:
// {
//   id: number;
//   name: string;
//   email: string;
// }
// (поле age исключено)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Какие поля исчезнут?

id: 40725_ts_omit_02_visual

Перед вами исходный интерфейс и определение нового типа с использованием утилиты Omit. Внимательно изучите код. Ваша задача — кликнуть на те свойства в исходном интерфейсе, которые будут удалены (исключены) в новом типе. Не отмечайте другие части кода, такие как ключевые слова, имена типов, фигурные скобки или свойства, которые останутся в новом типе.

Кликните по всем фрагментам, которые подходят под условие задания.
interface User {
  {{id~|~t1}}: number;
  {{name~|~t2}}: string;
  {{email~|~t3}}: string;
  {{password~|~t4}}: string;
  {{age~|~t5}}: number;
}

type UserWithoutSensitiveData = Omit;
Сообщения
Проверить
Показать подсказку

3. Исключение нескольких полей

id: 40725_ts_omit_03_select_multi

В этом задании вам предстоит использовать utility type Omit для исключения нескольких полей из интерфейса. В коде TypeScript объявлен интерфейс с несколькими свойствами. Вам нужно выбрать из выпадающего списка правильный union type (объединение строковых литералов), который исключит два указанных поля, чтобы получить новый тип с оставшимися свойствами. Обратите внимание на синтаксис union type и правильное написание строковых литералов.

Нужно правильно расставить в пропуски предложенные варианты
interface User {
  id: number;
  name: string;
  email: string;
  age: number;
  isActive: boolean;
}

// Исключите поля 'id' и 'age' из интерфейса User
type UserWithoutIdAndAge = Omit<User, input1S>;

const user: UserWithoutIdAndAge = {
  name: 'Alice',
  email: 'alice@example.com',
  isActive: true
};
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Ошибка в имени свойства

id: 40725_ts_omit_04_typo_fix

В данном фрагменте кода TypeScript используется утилитный тип Omit для создания нового типа путём исключения определённого свойства. Однако в строке с применением Omit допущена опечатка в имени исключаемого свойства — указано свойство, которого нет в исходном типе. Найдите и исправьте эту строку, чтобы код стал корректным и тип UserWithoutEmail был определён правильно.

Найдите ошибку и исправьте
type User = {
  id: number;
  name: string;
  email: string;
};
 
// Допущена опечатка в имени исключаемого свойства
type UserWithoutEmail = Omit<User, 'emial'>;
 
const user: UserWithoutEmail = {
  id: 1,
  name: 'John Doe'
};
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Исходный тип vs Результат

id: 40725_ts_omit_05_compare_types

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Omit<{ name: string; age: number; }, 'age'>
Omit<{ a: number; b: string; c: boolean; }, 'b' | 'c'>
Omit<{ x: number; y: number; z: number; }, 'z'>
Omit<{ id: number; title: string; content: string; }, 'id'>
Omit<{ firstName: string; lastName: string; age: number; }, 'age' | 'lastName'>
Осталось поле: a
Остались поля: x, y
Осталось поле: firstName
Остались поля: title, content
Осталось поле: name
Сообщения
Проверить
Показать подсказку

6. Создание DTO

id: 40725_ts_omit_06_construct

Из предложенных строк соберите корректное определение типа на TypeScript, используя утилитный тип Omit. Вам нужно создать тип CreateUserDto, который будет представлять собой базовый интерфейс User, но без поля 'id'. Включите только необходимые строки, чтобы код корректно компилировался в TypeScript. Лишние строки в решение не входят.

Перетяните в правильном порядке строки из одного блока в другой
interface User {
  id: number;
  name: string;
  email: string;
}
type CreateUserDto = Omit<User, 'id'>;
interface CreateUserDto {
  name: string;
  email: string;
}
type UserDto = Omit<User, 'email'>;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Доступность свойства

id: 40725_ts_omit_07_check_access

Проанализируйте приведённый фрагмент кода на TypeScript, в котором используется утилитарный тип Omit для создания нового типа. Затем выполняется попытка обращения к свойству, которое было исключено из этого типа. Определите, приведёт ли эта попытка к ошибке компиляции TypeScript. Выберите правильный вариант из предложенных.

Выберите правильный вариант ответа
type Person = {
  id: number;
  name: string;
  age: number;
  email: string;
};

type PersonWithoutEmail = Omit<Person, 'email'>;

const user: PersonWithoutEmail = {
  id: 1,
  name: "Alice",
  age: 30
};

console.log(user.email);
Сообщения
Проверить
Показать подсказку

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

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