Расскажи про утилити типы
Утилити типы (utility types) — это встроенные типы, которые помогают манипулировать другими типами и упрощают работу с ними. Они позволяют изменять, расширять, ограничивать и комбинировать типы, что делает код более гибким и безопасным. Вот некоторые из наиболее часто используемых утилити и их примеры:
1. Partial
Делает все свойства типа `T` необязательными.
```typescript
interface User {
id: number;
name: string;
email: string;
}
const updateUser = (id: number, userUpdates: Partial<User>) => {
// Обновление пользователя
};
updateUser(1, { name: 'Alice' }); // Можно передать только часть свойств
```
2. Required
Делает все свойства типа `T` обязательными.
```typescript
interface User {
id?: number;
name?: string;
email?: string;
}
const user: Required<User> = {
id: 1,
name: 'Alice',
email: 'alice@example.com'
}; // Все свойства должны быть указаны
```
3. Readonly
Делает все свойства типа `T` только для чтения.
```typescript
interface User {
id: number;
name: string;
email: string;
}
const user: Readonly<User> = {
id: 1,
name: 'Alice',
email: 'alice@example.com'
};
user.id = 2; // Ошибка: свойство id доступно только для чтения
```
4. Pick
Создает тип с набором свойств `K` из типа `T`.
```typescript
interface User {
id: number;
name: string;
email: string;
}
const user: Pick<User, 'id' | 'name'> = {
id: 1,
name: 'Alice'
}; // Только свойства id и name
```
5. Omit
Создает тип, исключающий свойства `K` из типа `T`.
```typescript
interface User {
id: number;
name: string;
email: string;
}
const user: Omit<User, 'email'> = {
id: 1,
name: 'Alice'
}; // Все свойства, кроме email
```
6. Record
Создает тип объекта, ключи которого из `K`, а значения типа `T`.
```typescript
type Roles = 'admin' | 'user' | 'guest';
const roles: Record<Roles, string> = {
admin: 'Admin User',
user: 'Regular User',
guest: 'Guest User'
};
```
7. Exclude
Создает тип, исключая из `T` те типы, которые находятся в `U`.
```typescript
type T = 'a' | 'b' | 'c';
type U = 'a';
type Result = Exclude<T, U>; // 'b' | 'c'
```
8. Extract
Создает тип, включающий только те типы из `T`, которые также находятся в `U`.
```typescript
type T = 'a' | 'b' | 'c';
type U = 'a' | 'c';
type Result = Extract<T, U>; // 'a' | 'c'
```
9. NonNullable
Исключает `null` и `undefined` из типа `T`.
```typescript
type T = string | number | null | undefined;
type NonNullableT = NonNullable<T>; // string | number
```
10. ReturnType
Получает тип возвращаемого значения функции `T`.
```typescript
function getUser() {
return { id: 1, name: 'Alice' };
}
type User = ReturnType<typeof getUser>; // { id: number, name: string }
```
Утилити типы помогают манипулировать типами, делая их более гибкими и безопасными. Они позволяют изменять, расширять, ограничивать и комбинировать типы. Вот основные утилити типы и их примеры:
Основные утилити 1. Partial: Делает все свойства типа необязательными.
```typescript
interface User {
id: number;
name: string;
email: string;
}
const updateUser = (id: number, userUpdates: Partial<User>) => {
// Обновление пользователя
};
updateUser(1, { name: 'Alice' }); // Можно передать только часть свойств
```
2. Required: Делает все свойства типа обязательными.
```typescript
interface User {
id?: number;
name?: string;
email?: string;
}
const user: Required<User> = {
id: 1,
name: 'Alice',
email: 'alice@example.com'
}; // Все свойства должны быть указаны
```
3. Readonly: Делает все свойства типа только для чтения.
```typescript
interface User {
id: number;
name: string;
email: string;
}
const user: Readonly<User> = {
id: 1,
name: 'Alice',
email: 'alice@example.com'
};
user.id = 2; // Ошибка: свойство id доступно только для чтения
```
4. Pick: Создает тип с набором свойств из указанного типа.
```typescript
interface User {
id: number;
name: string;
email: string;
}
const user: Pick<User, 'id' | 'name'> = {
id: 1,
name: 'Alice'
}; // Только свойства id и name
```
5. Omit: Создает тип, исключающий указанные свойства из типа.
```typescript
interface User {
id: number;
name: string;
email: string;
}
const user: Omit<User, 'email'> = {
id: 1,
name: 'Alice'
}; // Все свойства, кроме email
```
6. Record: Создает тип объекта с ключами из одного типа и значениями другого типа.
```typescript
type Roles = 'admin' | 'user' | 'guest';
const roles: Record<Roles, string> = {
admin: 'Admin User',
user: 'Regular User',
guest: 'Guest User'
};
```
7. Exclude: Исключает из типа те типы, которые находятся в другом типе.
```typescript
type T = 'a' | 'b' | 'c';
type U = 'a';
type Result = Exclude<T, U>; // 'b' | 'c'
```
8. Extract: Включает только те типы, которые находятся в обоих типах.
```typescript
type T = 'a' | 'b' | 'c';
type U = 'a' | 'c';
type Result = Extract<T, U>; // 'a' | 'c'
```
9. NonNullable: Исключает `null` и `undefined` из типа.
```typescript
type T = string | number | null | undefined;
type NonNullableT = NonNullable<T>; // string | number
```
10. ReturnType: Получает тип возвращаемого значения функции.
```typescript
function getUser() {
return { id: 1, name: 'Alice' };
}
type User = ReturnType<typeof getUser>; // { id: number, name: string }
```
Утилити типы — это встроенные типы, которые позволяют легко изменять, расширять и комбинировать другие типы. Они делают код более гибким, безопасным и удобным для поддержки.
June 1, 2024, easyoffer