From c1148c6078f68a5930c4fa9be2aa721d4aaf0ba3 Mon Sep 17 00:00:00 2001 From: RedrockJS Date: Wed, 22 Oct 2025 11:48:29 +0300 Subject: [PATCH] fix: update ts - mapped types --- docs/typescript/06-mapped-types.md | 49 +++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) 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