Расскажи про утилити типы

Утилити типы (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