Как работает 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 для извлечения типов из переменных, чтобы повысить типовую безопасность и гибкость кода.