JS Tower
JavaScript & TypeScriptМодуль 8: Продвинутый TypeScript

Utility Types

Встроенные утилитарные типы

Цель урока

В этом уроке ты научишься:

  • Использовать Partial, Required, Readonly
  • Применять Pick, Omit, Record
  • Работать с ReturnType, Parameters

Partial

Делает все свойства опциональными:

interface User {
  name: string;
  age: number;
  email: string;
}

type PartialUser = Partial<User>;
// { name?: string; age?: number; email?: string; }

function updateUser(user: User, updates: Partial<User>): User {
  return { ...user, ...updates };
}

Required

Делает все свойства обязательными:

interface Config {
  host?: string;
  port?: number;
}

type RequiredConfig = Required<Config>;
// { host: string; port: number; }

Readonly

Делает все свойства только для чтения:

interface User {
  name: string;
  age: number;
}

type ReadonlyUser = Readonly<User>;
// { readonly name: string; readonly age: number; }

let user: ReadonlyUser = { name: "Иван", age: 25 };
// user.age = 26; // Ошибка!

Pick

Выбирает указанные свойства:

interface User {
  id: number;
  name: string;
  email: string;
  password: string;
}

type PublicUser = Pick<User, "id" | "name" | "email">;
// { id: number; name: string; email: string; }

Omit

Исключает указанные свойства:

interface User {
  id: number;
  name: string;
  email: string;
  password: string;
}

type PublicUser = Omit<User, "password">;
// { id: number; name: string; email: string; }

Record

Создаёт тип с указанными ключами и значениями:

type Status = "pending" | "active" | "completed";

type StatusCounts = Record<Status, number>;
// { pending: number; active: number; completed: number; }

let counts: StatusCounts = {
  pending: 5,
  active: 10,
  completed: 20
};

Exclude и Extract

type T = "a" | "b" | "c" | "d";

type Excluded = Exclude<T, "a" | "b">;
// "c" | "d"

type Extracted = Extract<T, "a" | "b" | "e">;
// "a" | "b"

NonNullable

Исключает null и undefined:

type T = string | null | undefined;

type NonNull = NonNullable<T>;
// string

ReturnType

Получает тип возвращаемого значения:

function getUser() {
  return { name: "Иван", age: 25 };
}

type UserType = ReturnType<typeof getUser>;
// { name: string; age: number; }

Parameters

Получает типы параметров функции:

function greet(name: string, age: number): void {}

type Params = Parameters<typeof greet>;
// [string, number]

Сводная таблица

ТипОписание
Partial<T>Все свойства опциональны
Required<T>Все свойства обязательны
Readonly<T>Все свойства readonly
Pick<T, K>Выбрать свойства
Omit<T, K>Исключить свойства
Record<K, V>Объект с ключами K и значениями V
Exclude<T, U>Исключить типы из union
Extract<T, U>Извлечь типы из union
NonNullable<T>Исключить null/undefined
ReturnType<F>Тип возврата функции
Parameters<F>Типы параметров функции

Практика

Задание 1: Partial

Задача: Создай функцию обновления.

Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
{"name":"Телефон","price":45000}

Задание 2: Pick и Omit

Задача: Создай публичную версию User.

Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
{"id":1,"name":"Иван"}

Задание 3: Record

Задача: Создай словарь переводов.

Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
привет

Проверь себя

  1. Чем Pick отличается от Omit?
  2. Когда использовать Record?
  3. Как получить тип возврата функции?