← Назад ко всем вопросам

Какие знаешь Utility типы в TypeScript

1️⃣ Как кратко ответить

Utility типы в TypeScript — это встроенные типы, которые помогают манипулировать другими типами. Основные из них: Partial, Required, Readonly, Pick, Omit, Record, Exclude, Extract, NonNullable, ReturnType, InstanceType, Parameters, ConstructorParameters.

2️⃣ Подробное объяснение темы

Utility типы в TypeScript — это мощный инструмент, который позволяет разработчикам манипулировать типами данных, делая код более гибким и безопасным. Они помогают создавать новые типы на основе существующих, изменяя их свойства или поведение. Рассмотрим основные utility типы и их применение.

Partial

Partial<T> делает все свойства типа T необязательными.

interface User {
  name: string;
  age: number;
}
​
const updateUser = (user: Partial<User>) => {
  // user может содержать только часть свойств User
};
​
updateUser({ name: "Alice" }); // корректно

Required

Required<T> делает все свойства типа T обязательными.

interface User {
  name?: string;
  age?: number;
}
​
const user: Required<User> = {
  name: "Alice",
  age: 30
}; // все свойства обязательны

Readonly

Readonly<T> делает все свойства типа T только для чтения.

interface User {
  name: string;
  age: number;
}
​
const user: Readonly<User> = {
  name: "Alice",
  age: 30
};
​
// user.name = "Bob"; // Ошибка: нельзя изменить свойство

Pick

Pick<T, K> создает новый тип, выбирая только указанные свойства K из типа T.

interface User {
  name: string;
  age: number;
  email: string;
}
​
type UserNameAndEmail = Pick<User, "name" | "email">;
​
const user: UserNameAndEmail = {
  name: "Alice",
  email: "alice@example.com"
};

Omit

Omit<T, K> создает новый тип, исключая указанные свойства K из типа T.

interface User {
  name: string;
  age: number;
  email: string;
}
​
type UserWithoutEmail = Omit<User, "email">;
​
const user: UserWithoutEmail = {
  name: "Alice",
  age: 30
};

Record

Record<K, T> создает тип объекта с ключами типа K и значениями типа T.

type Role = "admin" | "user" | "guest";
​
const roles: Record<Role, string> = {
  admin: "Administrator",
  user: "Regular User",
  guest: "Guest User"
};

Exclude

Exclude<T, U> создает тип, исключая из T те типы, которые также присутствуют в U.

type T = "a" | "b" | "c";
type U = "a" | "b";
​
type V = Exclude<T, U>; // "c"

Extract

Extract<T, U> создает тип, который содержит только те типы из T, которые также присутствуют в U.

type T = "a" | "b" | "c";
type U = "a" | "b";
​
type V = Extract<T, U>; // "a" | "b"

NonNullable

NonNullable<T> исключает null и undefined из типа T.

type T = string | null | undefined;
​
type NonNullableT = NonNullable<T>; // string

ReturnType

ReturnType<T> извлекает тип возвращаемого значения из функции T.

function getUser() {
  return { name: "Alice", age: 30 };
}
​
type User = ReturnType<typeof getUser>; // { name: string; age: number; }

InstanceType

InstanceType<T> извлекает тип экземпляра класса или конструктора T.

class User {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}
​
type UserInstance = InstanceType<typeof User>; // User

Parameters

Parameters<T> извлекает типы параметров функции T в виде кортежа.

function getUser(name: string, age: number) {
  return { name, age };
}
​
type Params = Parameters<typeof getUser>; // [string, number]

ConstructorParameters

ConstructorParameters<T> извлекает типы параметров конструктора класса T в виде кортежа.

class User {
  constructor(public name: string, public age: number) {}
}
​
type UserConstructorParams = ConstructorParameters<typeof User>; // [string, number]

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

Тема: TypeScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки