0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Иногда при работе с объектными типами нам нужно избежать дублирования полей и переиспользовать уже существующие поля. В таком случае можно использовать механизм поиска типов<em>Lookup Types</em>:</p>
1
<p>Иногда при работе с объектными типами нам нужно избежать дублирования полей и переиспользовать уже существующие поля. В таком случае можно использовать механизм поиска типов<em>Lookup Types</em>:</p>
2
<p>Конструкция Type[Key] выглядит и работает также, как получение значения объекта по ключу в JavaScript. Разница только в том, что доступ через точку тут не сработает.</p>
2
<p>Конструкция Type[Key] выглядит и работает также, как получение значения объекта по ключу в JavaScript. Разница только в том, что доступ через точку тут не сработает.</p>
3
<p>Кроме того, Lookup Types позволяет получить объединение типов из объекта по нескольким известным ключам, объединенным с помощью вертикальной черты |:</p>
3
<p>Кроме того, Lookup Types позволяет получить объединение типов из объекта по нескольким известным ключам, объединенным с помощью вертикальной черты |:</p>
4
<p>Чтобы получить объединение всех ключей из объекта, можно использовать оператор keyof. Давайте упростим наш пример:</p>
4
<p>Чтобы получить объединение всех ключей из объекта, можно использовать оператор keyof. Давайте упростим наш пример:</p>
5
<p>Обсудим, как не дублировать все поля одного объектного типа в другом типе. Для этого используются два вспомогательных типа:</p>
5
<p>Обсудим, как не дублировать все поля одного объектного типа в другом типе. Для этого используются два вспомогательных типа:</p>
6
<ul><li>Pick<Type, Keys> - создает объектный тип с ключами Keys из Type</li>
6
<ul><li>Pick<Type, Keys> - создает объектный тип с ключами Keys из Type</li>
7
<li>Omit<Type, Keys> - создает объектный тип, из которого исключаются ключи Keys из Type</li>
7
<li>Omit<Type, Keys> - создает объектный тип, из которого исключаются ключи Keys из Type</li>
8
</ul><p>Так это выглядит на практике:</p>
8
</ul><p>Так это выглядит на практике:</p>
9
<p>В этом примере мы получим один и тот же тип в результате и Pick<Person, 'name' | 'age'>, и Omit<Person, 'location'>.</p>
9
<p>В этом примере мы получим один и тот же тип в результате и Pick<Person, 'name' | 'age'>, и Omit<Person, 'location'>.</p>
10
<p>Все Utility Types в TypeScript написаны с помощью встроенных конструкций. Мы уже изучили достаточно много концепций TypeScript, чтобы начать в них разбираться. Попробуем разобраться, как они реализованы. Изучим этот вопрос на примере типа Pick:</p>
10
<p>Все Utility Types в TypeScript написаны с помощью встроенных конструкций. Мы уже изучили достаточно много концепций TypeScript, чтобы начать в них разбираться. Попробуем разобраться, как они реализованы. Изучим этот вопрос на примере типа Pick:</p>
11
<p>В коде выше мы видим тип Pick<T, K>. Это дженерик с двумя параметрами - T и K. На K мы также наложили ограничение extends keyof T, чтобы параметр K содержал перечисление ключей из T.</p>
11
<p>В коде выше мы видим тип Pick<T, K>. Это дженерик с двумя параметрами - T и K. На K мы также наложили ограничение extends keyof T, чтобы параметр K содержал перечисление ключей из T.</p>
12
<p>Далее с помощью оператора in выполняется перебор по всем элементам перечисления. Каждый полученный элемент становится ключом. Для его значения мы ищем подходящий тип в объектном типе T[P].</p>
12
<p>Далее с помощью оператора in выполняется перебор по всем элементам перечисления. Каждый полученный элемент становится ключом. Для его значения мы ищем подходящий тип в объектном типе T[P].</p>
13
<p>Операторы keyof (<em>Lookup Types</em>) и in (<em>Mapped Types</em>) часто идут вместе. С помощью keyof мы получаем доступ ко всем именам свойств объектного типа, а благодаря in можем циклически пройти по всем свойствам. Эти две операции являются ключевыми при создании своих вспомогательных типов при работе с объектными типами данных.</p>
13
<p>Операторы keyof (<em>Lookup Types</em>) и in (<em>Mapped Types</em>) часто идут вместе. С помощью keyof мы получаем доступ ко всем именам свойств объектного типа, а благодаря in можем циклически пройти по всем свойствам. Эти две операции являются ключевыми при создании своих вспомогательных типов при работе с объектными типами данных.</p>