При сопоставлении типов можно менять атрибуты свойств такие как неизменность (immutability) и необязательность (optionality). Делается это с помощью соответствующих модификаторов: readonly
и ?
.
Чтобы добавить или удалить эти модификаторы, можно использовать префиксы +
или -
. Если не использовать префикс, то подразумевается что модификатор будет добавлен, то есть по умолчанию префикс +
.
Примеры использования модификаторов есть в Utility Types:
/**
* Делает все свойства типа `T` необязательными,
* то есть добавляет атрибут `?`.
*/
type Partial<T> = {
[P in keyof T]?: T[P];
};
/**
* Делает все свойства типа `T` обязательными,
* то есть удаляет атрибут `?`.
*/
type Required<T> = {
[P in keyof T]-?: T[P];
};
/**
* Делает все свойства типа `T` неизменяемыми,
* то есть добавляет атрибут `readonly`.
*/
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
Подобным образом можно написать и тип, который делает все свойства типа изменяемыми, то есть удаляет атрибут readonly
:
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
Благодаря таким типам легче делать производные типы из уже имеющихся.
Например, в приложении может быть тип DefaultUser
для не авторизованного пользователя у которого все поля необязательные:
type DefaultUser = {
id?: string;
firstName?: string;
secondName?: string;
email?: string;
};
Из него можно сделать авторизованного пользователя с помощью типа Required
:
type AuthorizedUser = Required<DefaultUser>;

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.