Весной стартует сезон найма, успей отхватить свой оффер!

Как работает keyof и typeof в TypeScript

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

Оператор keyof

Оператор keyof позволяет извлечь все ключи объекта в виде строкового объединения. Это полезно, когда вам нужно работать с объектами и проверять ключи, доступные для них, или когда вы хотите типизировать переменные, которые должны быть одним из ключей объекта.

Пример использования keyof

Предположим, у нас есть объект с некоторыми свойствами, и мы хотим получить тип всех ключей этого объекта.

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

type PersonKeys = keyof Person;  // "name" | "age" | "email"

В этом примере keyof Person создаёт объединённый тип строк, который содержит все ключи из типа Person. В данном случае, PersonKeys будет типом "name" | "age" | "email", то есть каждый ключ объекта Person будет доступен как тип Теперь мы можем использовать PersonKeys для объявления переменных, которые могут быть только одним из этих ключей:

let key: PersonKeys;

key = "name";   // Допустимо
key = "age";    // Допустимо
key = "address"; // Ошибка: Тип '"address"' не может быть присвоен типу '"name" | "age" | "email"'

Оператор typeof

Оператор typeof позволяет извлечь тип переменной или значения. Это полезно, когда вам нужно узнать тип переменной, не указывая его явно, и использовать этот тип в других частях кода.

Пример использования typeof

let person = {
  name: "John",
  age: 30,
  email: "john@example.com"
};

type PersonType = typeof person;
// PersonType будет типом { name: string, age: number, email: string }

Совместное использование keyof и typeof

keyof и typeof могут быть использованы вместе для создания более гибкой типизации и работы с ключами объектов. Это позволяет получить типы из существующих значений и работать с их ключами.

Пример использования keyof и typeof

const person = {
  name: "John",
  age: 30,
  email: "john@example.com"
};

type PersonKeys = keyof typeof person;  // "name" | "age" | "email"

let key: PersonKeys;
key = "name";  // Допустимо
key = "email"; // Допустимо
key = "address"; // Ошибка: Тип '"address"' не может быть присвоен типу '"name" | "age" | "email"'

Здесь typeof person извлекает тип объекта person, а keyof затем извлекает все ключи из этого типа, создавая объединённый тип, содержащий "name" | "age" | "email".

Рекомендация:

Используйте keyof для работы с ключами объектов и typeof для извлечения типов из переменных, чтобы повысить типовую безопасность и гибкость кода.