Оператор typeof в типах

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

Тренажер по TypeScript

Оператор typeof в JavaScript возвращает строку с типом значения во время выполнения. Однако в TypeScript у него есть вторая, более мощная роль: использование в контексте типов.

Конструкция type X = typeof Y позволяет автоматически извлечь тип из существующей переменной, объекта или функции. Это избавляет от дублирования кода: если вы меняете структуру исходного объекта, тип обновляется автоматически. Это основа принципа DRY в типизации.

  • Используется для создания типов конфигураций.
  • Помогает типизировать пропсы на основе значений по умолчанию.
  • Работает на этапе компиляции, не попадая в итоговый JS-код в таком виде.

В этом уроке мы научимся захватывать типы значений и использовать их для типизации других переменных.

Список тем

1. Захват типа переменной

id: 40743_typeof_01_replace

В этом задании вам нужно создать новый тип Config на основе существующего объекта settings. Используйте оператор typeof для захвата типа переменной settings. Заполните пропуск в коде так, чтобы тип Config корректно соответствовал структуре объекта. Это упражнение поможет понять, как оператор typeof применяется в контексте типов TypeScript для создания типов на основе значений.

Заполните пропуски
const settings = {
  theme: 'dark',
  fontSize: 14,
  language: 'en'
};

type Config = input1S;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Применение типа к новой переменной

id: 40743_typeof_02_select

В этом задании вам предстоит применить оператор typeof для получения типа существующей переменной и использования его при объявлении новой переменной. В коде TypeScript ниже объявлена переменная product. Вам нужно объявить вторую переменную newProduct, которая должна иметь тот же тип, что и product. Для этого заполните пропуск в аннотации типа, выбрав правильный вариант из выпадающего списка. Обратите внимание, что оператор typeof возвращает тип значения переменной во время компиляции и может использоваться в аннотациях типов.

Нужно правильно расставить в пропуски предложенные варианты
let product = { title: "Book", price: 20 };
let newProduct: input1S = { title: "Pen", price: 5 };
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Пространство значений и типов

id: 40743_typeof_03_highlight

В данном фрагменте кода TypeScript оператор `typeof` используется в двух разных контекстах: как оператор JavaScript во время выполнения и как оператор TypeScript для работы с типами. Разметьте каждый выделенный фрагмент, указав, используется ли `typeof` в контексте JavaScript (в условных конструкциях) или в контексте TypeScript (после двоеточия в аннотациях типов). Обратите внимание на синтаксис и расположение оператора в коде.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
function processValue(input: unknown) {
  if ({{typeof~|~t1}} input === 'string') {
    console.log(input.length);
  }
}

const data = { x: 10, y: 'text' };
type DataType = {{typeof~|~t2}} data;

const value: {{typeof~|~t3}} data.x = 5;
typeof в JavaScript (runtime)
typeof в TypeScript (type context)
Сообщения
Проверить
Показать подсказку

4. Ошибка в использовании typeof

id: 40743_typeof_04_error

В этом фрагменте TypeScript-кода допущена ошибка в использовании оператора typeof. Код пытается создать тип на основе существующей переменной, но используется неверный синтаксис. Исправьте строку с ошибкой, чтобы корректно определить тип переменной.

Найдите ошибку и исправьте
const person = { name: 'Alice', age: 30 };
type PersonType = typeof person;
const newPerson: PersonType = { name: 'Bob', age: 25 };
console.log(newPerson);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Типизация функции через typeof

id: 40743_typeof_05_build

Из предложенных строк соберите корректную TypeScript-программу, которая создаёт тип функции на основе существующей функции `add` (складывающей два числа) с помощью оператора `typeof`, затем объявляет переменную этого типа и вызывает её. Игнорируйте лишние строки, которые содержат ошибки типов или не соответствуют заданию.

Перетяните в правильном порядке строки из одного блока в другой
function add(x: number, y: number): number {
    return x + y;
}
type AddFunction = typeof add;
const myAdd: AddFunction = add;
console.log(myAdd(2, 3));
const myAdd: AddFunction = (x: string, y: string) => x + y;
console.log(add(2));
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Совместимость типов

id: 40743_typeof_06_predict

Проанализируйте приведённый фрагмент кода на TypeScript. В нём определены два объекта (objA и objB) и тип TypeFromA, полученный с помощью оператора typeof от objA. Затем объект objB присваивается переменной objC, тип которой указан как TypeFromA. Определите, будет ли такое присваивание успешным (совместимы ли типы) или приведёт к ошибке компиляции. Выберите правильный вариант ответа.

Выберите правильный вариант ответа
const objA = {
    name: "Alice",
    age: 30
};

const objB = {
    name: "Bob"
};

type TypeFromA = typeof objA;

const objC: TypeFromA = objB; // Что произойдёт здесь?
Сообщения
Проверить
Показать подсказку

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

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