Какие знаешь 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 значительно упрощают работу с типами, делая код более выразительным и безопасным. Они позволяют легко изменять и адаптировать типы данных под конкретные задачи, что особенно полезно в больших проектах с динамическими структурами данных.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться