JavaScript & TypeScriptМодуль 8: Продвинутый TypeScript
Utility Types
Встроенные утилитарные типы
Цель урока
В этом уроке ты научишься:
- Использовать Partial, Required, Readonly
- Применять Pick, Omit, Record
- Работать с ReturnType, Parameters
Partial
Делает все свойства опциональными:
interface User {
name: string;
age: number;
email: string;
}
type PartialUser = Partial<User>;
// { name?: string; age?: number; email?: string; }
function updateUser(user: User, updates: Partial<User>): User {
return { ...user, ...updates };
}Required
Делает все свойства обязательными:
interface Config {
host?: string;
port?: number;
}
type RequiredConfig = Required<Config>;
// { host: string; port: number; }Readonly
Делает все свойства только для чтения:
interface User {
name: string;
age: number;
}
type ReadonlyUser = Readonly<User>;
// { readonly name: string; readonly age: number; }
let user: ReadonlyUser = { name: "Иван", age: 25 };
// user.age = 26; // Ошибка!Pick
Выбирает указанные свойства:
interface User {
id: number;
name: string;
email: string;
password: string;
}
type PublicUser = Pick<User, "id" | "name" | "email">;
// { id: number; name: string; email: string; }Omit
Исключает указанные свойства:
interface User {
id: number;
name: string;
email: string;
password: string;
}
type PublicUser = Omit<User, "password">;
// { id: number; name: string; email: string; }Record
Создаёт тип с указанными ключами и значениями:
type Status = "pending" | "active" | "completed";
type StatusCounts = Record<Status, number>;
// { pending: number; active: number; completed: number; }
let counts: StatusCounts = {
pending: 5,
active: 10,
completed: 20
};Exclude и Extract
type T = "a" | "b" | "c" | "d";
type Excluded = Exclude<T, "a" | "b">;
// "c" | "d"
type Extracted = Extract<T, "a" | "b" | "e">;
// "a" | "b"NonNullable
Исключает null и undefined:
type T = string | null | undefined;
type NonNull = NonNullable<T>;
// stringReturnType
Получает тип возвращаемого значения:
function getUser() {
return { name: "Иван", age: 25 };
}
type UserType = ReturnType<typeof getUser>;
// { name: string; age: number; }Parameters
Получает типы параметров функции:
function greet(name: string, age: number): void {}
type Params = Parameters<typeof greet>;
// [string, number]Сводная таблица
| Тип | Описание |
|---|---|
Partial<T> | Все свойства опциональны |
Required<T> | Все свойства обязательны |
Readonly<T> | Все свойства readonly |
Pick<T, K> | Выбрать свойства |
Omit<T, K> | Исключить свойства |
Record<K, V> | Объект с ключами K и значениями V |
Exclude<T, U> | Исключить типы из union |
Extract<T, U> | Извлечь типы из union |
NonNullable<T> | Исключить null/undefined |
ReturnType<F> | Тип возврата функции |
Parameters<F> | Типы параметров функции |
Практика
Задание 1: Partial
Задача: Создай функцию обновления.
Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
{"name":"Телефон","price":45000}Задание 2: Pick и Omit
Задача: Создай публичную версию User.
Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
{"id":1,"name":"Иван"}Задание 3: Record
Задача: Создай словарь переводов.
Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
привет
Проверь себя
- Чем Pick отличается от Omit?
- Когда использовать Record?
- Как получить тип возврата функции?