Skip to main content

Utility types

Utility Types в TypeScript — это встроенные generic-типы, которые предоставляют удобные способы для преобразования или манипуляции существующими типами. Они упрощают работу с типами, позволяя создавать новые типы на основе существующих без необходимости писать сложные конструкции вручную.

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

Список популярных Utility Types

1. Partial<T>

Создает тип, в котором все свойства T становятся необязательными.

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

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

2. Required<T>

Создает тип, в котором все свойства T становятся обязательными.

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

type RequiredUser = Required<User>;
// { name: string; age: number; }

3. Readonly<T>

Создает тип, в котором все свойства T доступны только для чтения.

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

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

4. Record<K, T>

Создает тип, представляющий объект, где ключи имеют тип K, а значения — тип T.

type UserRoles = Record<string, string>;
// { [key: string]: string }

const roles: UserRoles = {
admin: "Admin",
user: "User",
};

5. Pick<T, K>

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

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

type UserNameAndAge = Pick<User, "name" | "age">;
// { name: string; age: number; }

6. Omit<T, K>

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

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

type UserWithoutEmail = Omit<User, "email">;
// { name: string; age: number; }

7. Exclude<T, U>

Исключает из типа T все типы, которые можно присвоить U.

type T = string | number | boolean;
type StringOrNumber = Exclude<T, boolean>;
// string | number

8. Extract<T, U>

Извлекает из типа T только те типы, которые можно присвоить U.

type T = string | number | boolean;
type OnlyBoolean = Extract<T, boolean>;
// boolean

9. NonNullable<T>

Удаляет null и undefined из типа T.

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

10. ReturnType<T>

Создает тип, представляющий тип возвращаемого значения функции T.

function getUser() {
return { name: "John", age: 30 };
}

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

11. Parameters<T>

Создает тип, представляющий кортеж параметров функции T.

function add(a: number, b: number) {
return a + b;
}

type AddParams = Parameters<typeof add>;
// [a: number, b: number]

12. ConstructorParameters<T>

Создает тип, представляющий кортеж параметров конструктора класса T.

class User {
constructor(public name: string, public age: number) {}
}

type UserConstructorParams = ConstructorParameters<typeof User>;
// [name: string, age: number]

13. InstanceType<T>

Создает тип, представляющий тип экземпляра класса T.

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

type UserInstance = InstanceType<typeof User>;
// User

14. ThisParameterType<T>

Извлекает тип параметра this из функции T.

function greet(this: { name: string }) {
console.log(`Hello, ${this.name}`);
}

type GreetThisType = ThisParameterType<typeof greet>;
// { name: string }

15. OmitThisParameter<T>

Создает тип функции, удаляя параметр this.

function greet(this: { name: string }) {
console.log(`Hello, ${this.name}`);
}

type GreetWithoutThis = OmitThisParameter<typeof greet>;
// () => void

Примеры использования Utility Types

Пример 1: Создание частичного объекта

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

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

Пример 2: Выбор конкретных свойств

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

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

Пример 3: Исключение свойств

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

type UserWithoutEmail = Omit<User, "email">;
// { name: string; age: number; }

Итог

Utility Types в TypeScript — это мощный инструмент для работы с типами. Они позволяют:

  • Упрощать создание новых типов на основе существующих.
  • Уменьшать дублирование кода.
  • Повышать читаемость и поддерживаемость кода.

Использование Utility Types делает TypeScript более гибким и выразительным, особенно в больших проектах.

🚀 Источник: DeepSeek