diff --git a/docs/typescript/06-mapped-types.md b/docs/typescript/06-mapped-types.md index 7835be3..a676601 100644 --- a/docs/typescript/06-mapped-types.md +++ b/docs/typescript/06-mapped-types.md @@ -33,4 +33,51 @@ sidebar_position: 6 - `Partial` – все свойства необязательные. - `Required` – все свойства обязательные. - `Pick` – выбирает только указанные ключи `K` из `T`. -- `Record` – создаёт тип с ключами `K` и значениями `V`. \ No newline at end of file +- `Record` – создаёт тип с ключами `K` и значениями `V`. + +Пример из практики: + +```ts +interface Movie { + title: string; + director: string; + awards?: string; +} + +type Keys = keyof Movie; // это обычный union 'title' | 'director' | 'awards' + +// Mapped type +type MovieCopy = { + [Property in keyof Movie]: number; // Property переменная, в результате просто изменится тип на number у всех ключей +}; + +// делаем все поля только для чтения +type ReadonlyMovie = { + readonly [Property in keyof Movie]: Movie[Property]; +}; + +// делаем все поля опциональными +type OptionalMovie = { + readonly [Property in keyof Movie]?: Movie[Property]; +}; + +// делаем все поля обязательными +type RequiredMovie = { + readonly [Property in keyof Movie]-?: Movie[Property]; +}; + +// убираем readonly из всех полей +type EditableMovie = { + -readonly [Property in keyof Movie]-?: Movie[Property]; +}; + +type MovieSetters = { + [Property in keyof Movie as `set${Capitalize}`]-?: ( + value: Movie[Property] + ) => void; +}; + +type MovieGetters = { + [Property in keyof Movie as `set${Capitalize}`]-?: () => Movie[Property]; +}; +``` \ No newline at end of file