Оператор keyof в TypeScript позволяет получить тип, представляющий собой объединение (union) всех ключей объекта или интерфейса. Например, для интерфейса User с полями id и name, конструкция keyof User вернет тип "id" | "name".
Это крайне полезно при написании универсальных функций, которые принимают имя свойства в качестве аргумента. Используя keyof, мы можем гарантировать, что передаваемая строка точно соответствует названию одного из полей объекта, исключая опечатки и ошибки доступа.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Определение Union типа
В данном задании вам предстоит применить оператор keyof для интерфейса TypeScript. Ниже приведён код, в котором определён интерфейс Car с тремя полями. Вам необходимо вручную определить и ввести строку, которая является результатом применения оператора keyof к этому интерфейсу. Результат должен быть представлен в виде union-типа, перечисляющего все ключи интерфейса через символ '|'. Введите только эту строку, без дополнительных пробелов в начале и конце.
interface Car {
brand: string;
model: string;
year: number;
}
// Какой будет результат keyof Car?2. Использование в Generic
В этом задании вам нужно дополнить обобщённую функцию `getProperty`, чтобы она корректно ограничивала тип второго аргумента (ключа) ключами первого аргумента (объекта). Используйте оператор `keyof` в ограничении дженерика, чтобы обеспечить типобезопасность при доступе к свойствам объекта. После правильного заполнения пропуска функция должна компилироваться и возвращать значение свойства по указанному ключу.
function getProperty<T, K extends input1S>(obj: T, key: K): T[K] {
return obj[key];
}
const person = { name: "Alice", age: 30 };
const name = getProperty(person, "name");
console.log(name);3. Выделение оператора
В данном задании вам необходимо разметить фрагменты кода TypeScript, содержащего оператор keyof. Обратите внимание на строку с определением типа и выделите в ней оператор keyof, а также имя типа, к которому он применяется. Для выделенных сегментов выберите соответствующий тип из предложенных вариантов: «Оператор keyof» или «Имя типа». Это упражнение поможет закрепить понимание синтаксиса и применения оператора keyof в TypeScript.
type Keys = {{keyof~|~t1}} {{Person~|~t2}};4. Функция получения свойства
Из предложенных строк соберите корректную TypeScript-программу, которая объявляет функцию getProperty, использующую оператор keyof для безопасного доступа к свойству объекта, а затем демонстрирует её использование на примере объекта person. Некоторые строки лишние и не должны входить в решение. Программа должна вывести имя 'Alice'.
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key];}const person = { name: 'Alice', age: 30 };const name = getProperty(person, 'name');console.log(name);const age = person.age;function getProperty(obj: any, key: string): any {return obj.key;5. Невалидный ключ
В этом фрагменте TypeScript-кода определён интерфейс User и функция, которая принимает ключ этого интерфейса с использованием оператора keyof. Однако при вызове функции передаётся строка, которая не соответствует ни одному из ключей интерфейса User. Найдите строку с ошибкой и исправьте её, заменив невалидный ключ на существующий ключ интерфейса User.
interface User { name: string; age: number;} function getValue(obj: User, key: keyof User) { return obj[key];} const user: User = { name: 'Alice', age: 25 }; console.log(getValue(user, 'fullName'));6. Типизация ключей
В этом задании вам предстоит работать с оператором keyof в TypeScript. Дан интерфейс, описывающий объект книги. Вам нужно выбрать правильную конструкцию keyof, чтобы создать тип, разрешающий только ключи этого интерфейса, а затем использовать этот тип для объявления переменной. Для заполнения пропусков используйте варианты из выпадающего списка. Обратите внимание на синтаксис keyof и то, как он генерирует объединение строковых литералов.
interface Book {
title: string;
author: string;
year: number;
}
// Создайте тип Keys, который будет объединением ключей Book.
type Keys = input1S;
// Объявите переменную key, которая может быть только одним из ключей Book.
let key: Keys = input2S;7. Создание типизированной переменной
Перед вами строки TypeScript-кода, перемешанные в случайном порядке. Восстановите правильную последовательность, чтобы получился корректный код, демонстрирующий использование оператора keyof. Код должен объявлять интерфейс, создавать тип с помощью keyof, объявлять переменную этого типа и присваивать ей значение. Правильный порядок обеспечит корректную типизацию переменной.
name: string;let property: PersonKeys;type PersonKeys = keyof Person;interface Person {property = "name";} age: number;