fix: update ts - mapped types
This commit is contained in:
@@ -33,4 +33,51 @@ sidebar_position: 6
|
||||
- `Partial<T>` – все свойства необязательные.
|
||||
- `Required<T>` – все свойства обязательные.
|
||||
- `Pick<T, K>` – выбирает только указанные ключи `K` из `T`.
|
||||
- `Record<K, V>` – создаёт тип с ключами `K` и значениями `V`.
|
||||
- `Record<K, V>` – создаёт тип с ключами `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<Property>}`]-?: (
|
||||
value: Movie[Property]
|
||||
) => void;
|
||||
};
|
||||
|
||||
type MovieGetters = {
|
||||
[Property in keyof Movie as `set${Capitalize<Property>}`]-?: () => Movie[Property];
|
||||
};
|
||||
```
|
||||
Reference in New Issue
Block a user