Как через keyof получить доступ к вложенным свойствам типа?

В TypeScript можно использовать keyof для доступа к вложенным свойствам типа.

Предположим у вас есть следующий тип данных:

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

Чтобы получить доступ к вложенным свойствам типа Person, вы можете использовать ключевое слово keyof и оператор доступа точка (.) с использованием выражения типа. Например:

type PersonKeys = keyof Person; // 'name' | 'age' | 'address'

type AddressKeys = keyof Person['address']; // 'street' | 'city'

В первом случае мы получаем все ключи (свойства) типа Person: 'name', 'age' и 'address'.

Во втором случае мы получаем все ключи (свойства) вложенного типа Person['address']: 'street' и 'city'.

Теперь, используя keyof для доступа к вложенным свойствам типа, вы можете использовать их в других местах кода. Например, вы можете использовать их для создания обобщенных функций, которые обрабатывают свойства конкретного типа:

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

const person: Person = {
  name: 'John',
  age: 25,
  address: {
    street: '123 Main St',
    city: 'New York',
  },
};

const name = getProperty(person, 'name'); // 'John'

const street = getProperty(person.address, 'street'); // '123 Main St'

В этом примере мы создали обобщенную функцию getProperty, которая принимает объект и ключ (свойство), и возвращает значение свойства. Затем мы передали объект типа Person и строку 'name' в качестве аргументов и получили значение свойства 'name' объекта person. Мы также передали вложенный объект person.address и строку 'street' в качестве аргументов и получили значение свойства 'street' этого вложенного объекта.

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