Как определить тип объекта со скрещенными значениями в определённых ключах?

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

Предположим, у нас есть объект person, который содержит информацию о человеке:

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

Теперь давайте определим тип для этого объекта, но с определенными ключами:

type PersonInfo = {
  name: string;
  address: {
    country: string;
  };
};

Здесь мы определяем тип PersonInfo, который имеет свойства name и address. В свою очередь, address - это объект, который имеет только свойство country.

Теперь можем использовать keyof PersonInfo и typeof для определения типа объекта со скрещенными значениями в определенных ключах:

type PersonWithInfo = {
  [K in keyof PersonInfo]: typeof person[K];
};

В этом коде мы используем цикл in в связке с keyof PersonInfo, чтобы пройти по всем ключам в PersonInfo. Затем мы используем typeof person[K], чтобы получить тип значения по ключу K в объекте person.

Теперь, если мы создадим новый объект personWithInfo, используя тип PersonWithInfo, TypeScript будет использовать значения из объекта person, но с типами, определенными в PersonInfo:

const personWithInfo: PersonWithInfo = {
  name: 'John',
  address: {
    country: 'USA'
  }
};

console.log(personWithInfo.name); // 'John'
console.log(personWithInfo.address.country); // 'USA'

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