Indexed Access Types

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

Изучаем продвинутую технику работы с типами — Indexed Access Types. Этот механизм позволяет «вытаскивать» тип конкретного свойства из другого типа, используя квадратные скобки, похоже на то, как мы получаем значения из массивов или объектов в JavaScript.

С помощью конструкции T[K] можно ссылаться на типы полей интерфейсов, не дублируя код. Это особенно полезно при поддержке больших проектов, когда изменение в одном интерфейсе должно автоматически подтягиваться в другие места. Мы также затронем использование операторов keyof и typeof для динамического получения ключей.

Вас ждут практические упражнения, где нужно определить правильный тип переменной, найти ошибку в синтаксисе и собрать корректную конструкцию.

Список тем

1. Поиск Indexed Access

id: 40745_idx_01_syntax

Перед вами фрагмент кода на TypeScript, содержащий интерфейсы и объявления типов. Внимательно изучите код и найдите все места, где используется синтаксис Indexed Access Types — доступ к типу свойства объекта по ключу через квадратные скобки (например, `Type['key']`). Отметьте только эти конструкции, не выделяя другие элементы кода, такие как имена интерфейсов, ключевые слова или объявления обычных типов.

Кликните по всем фрагментам, которые подходят под условие задания.
interface User {
  id: number;
  name: string;
  email: string;
}

interface Product {
  id: number;
  title: string;
  price: number;
}

// Примеры использования Indexed Access Types
{{type UserId = User['id']~|~t1}};
{{type UserEmail = User['email']~|~t2}};
{{type ProductPrice = Product['price']~|~t3}};

// Другие объявления типов (не Indexed Access)
type UserKeys = keyof User;
type ProductType = Product;

function getProperty(obj: T, key: K): T[K] {
  return obj[key];
}
Сообщения
Проверить
Показать подсказку

2. Определение типа

id: 40745_idx_02_result

Дан интерфейс Car с полями разных типов. Определите, какой тип TypeScript вернёт выражение Car['model']. Введите название типа в поле ответа. Обратите внимание, что тип должен быть указан в том виде, в котором он используется в TypeScript (например, string, number, boolean).

Что должно получиться?
interface Car {
  brand: string;
  model: string;
  year: number;
  color: string;
}

// Какой тип вернёт выражение Car['model']?
Сообщения
Проверить
Показать подсказку

3. Доступ к вложенному типу

id: 40745_idx_03_replace

В этом задании вам нужно использовать indexed access types (типы доступа по индексу) для извлечения вложенных типов из сложной структуры. Дополните код, указав правильные ключи в квадратных скобках, чтобы получить доступ к типу 'details' и типу 'name' внутри него. Обратите внимание на структуру объекта 'Product' и используйте операторы keyof и typeof для получения нужных типов.

Заполните пропуски
type Product = {
  id: number;
  details: {
    name: string;
    price: number;
  };
};

const productExample = {
  id: 1,
  details: {
    name: 'Laptop',
    price: 999
  }
};

// Получите тип свойства 'details' из типа Product
type DetailsType = Product[input1S];

// Получите тип свойства 'name' из типа details, используя переменную productExample и typeof
type NameType = typeof productExample[input2S]['name'];
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Типы выражений

id: 40745_idx_04_sort

Перед вами список выражений, использующих indexed access types (типы доступа по индексу) для интерфейса Product. Ваша задача — распределить каждое выражение в одну из двух категорий: выражения, которые возвращают тип `string`, и выражения, которые возвращают тип `number`. Обратите внимание, что тип выражения определяется типом свойства интерфейса Product, к которому осуществляется доступ. Интерфейс Product определён следующим образом: `interface Product { id: number; name: string; price: number; description: string; category: string; inStock: boolean; }`.

Перетяните элементы в соответствующие блоки
Тип string
Тип number
Product['name']
Product['id']
Product['price']
Product['description']
Product['id'] | Product['price']
Product['name'] | Product['description']
Сообщения
Проверить
Показать подсказку

5. Несуществующий ключ

id: 40745_idx_05_error

В этом фрагменте TypeScript-кода используется indexed access type для получения типа свойства интерфейса. Однако в коде допущена ошибка: указан несуществующий ключ (опечатка). Вам нужно найти и исправить эту ошибку, чтобы код стал корректным и компилировался без ошибок.

Найдите ошибку и исправьте
interface User {
  name: string;
  age: number;
  email: string;
}
 
type UserName = User['naem']; // Опечатка в ключе
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Логика разрешения типа

id: 40745_idx_06_analyze

Проанализируйте TypeScript-код сверху и восстановите последовательность шагов, которые TypeScript выполняет для вычисления типа `T[keyof T]`. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить логику разрешения типа от определения исходного типа до получения итогового union-типа значений.

type Person = {
  name: string;
  age: number;
  city: string;
};

// Используем Indexed Access Types с keyof
type PersonValues = Person[keyof Person]; // Результирующий тип

// Пример объекта для наглядности
const person: Person = {
  name: "Alice",
  age: 30,
  city: "London"
};
Расположите элементы в логичном порядке
Применение оператора keyof к типу T для получения union-типа всех его ключей: keyof Person"name" | "age" | "city"
Определение исходного типа T (в примере: Person с полями name: string, age: number, city: string)
Упрощение union-типа: удаление дубликатов → итоговый тип string | number
TypeScript объединяет полученные типы значений в единый union-тип: string | number | string
Для каждого ключа из union-типа keyof T TypeScript обращается к соответствующему типу значения в T через Indexed Access
Сообщения
Проверить
Показать подсказку

7. Массивы и индексы

id: 40745_idx_07_select

В этом задании вам нужно заполнить пропуски в коде TypeScript, чтобы получить тип элемента массива с помощью indexed access types. Для этого используется ключевое слово `number` в конструкции `Type[number]`. Выберите из выпадающего списка правильные варианты для каждого пропуска, чтобы код стал корректным и компилировался без ошибок.

Нужно правильно расставить в пропуски предложенные варианты
type Colors = string[];
type Color = Colors[input1S];

type Numbers = number[];
type NumberType = Numbers[input2S];

type Booleans = boolean[];
type BooleanType = Booleans[input3S];

type Mixed = (string | number)[];
type MixedType = Mixed[input4S];
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

TypeScript: компиляция и запуск

id: 40745_compiler
TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру