В системе типов TypeScript есть группа, которая называется гомоморфной, т.е. типы, которые изменяют функциональность, сохраняя первоначальные свойства применяемой сущности. В этой группе есть четыре типа: Readonly, Partial, Required, Pick.
Readonly — добавляет каждому свойству/методу объекта модификатор readonly, т.е. делает их доступными только для чтения.
type User = {
name?: string;
}
type ReadonlyUser = Readonly<User> // { readonly name?: string; }
const user: ReadonlyUser = {
name: 'Jack'
}
// Cannot assign to 'name' because it is a read-only property.
user.name = 'John'
Обратите внимание на знак вопроса у свойства name. Мы намеренно сделали его необязательным, но Readonly оставит его таковым, так как, являясь гомоморфным, он не изменяет остальные модификаторы.Partial добавляет всем свойствам/методам модификатор ?, делая их необязательными.
type User = {
readonly name: string;
age: number;
};
type OptionalUser = Partial<User>; // { readonly name?: string; age?: number; }
const user: OptionalUser = {}; // Ok!
Required противоположен Partial. Он превращает члены объекта в обязательные, удаляя модификатор ?.type User = {
readonly name?: string;
age?: number;
};
type RequiredUser = Required<User>; // { readonly name: string; age: number; }
/**
* Type '{}' is missing the following properties
* from type 'Required<User>': name, age
*/
const user: RequiredUser = {}
И последний — Pick. Фильтрует объектный тип по свойствам/методам и формирует из него новый тип. Если вы знаете, как работает тип Omit, то это противоположная ему процедура. Первый дженерик принимает в себя фильтруемый тип, а второй — перечисление свойств/методов, которые требуется отфильтровать (перечисляются через оператор | ):type User = {
readonly name: string;
age: number;
height: number;
};
// { readonly name: string; age: number; }
type PickUser = Pick<User, 'name' | 'age'>;
const user: PickUser = {
name: 'Jack'
}
// Cannot assign to 'name' because it is a read-only property.
user.name = 'John'
