Определение типа Typescript на основе свойств объектов в списке

#javascript #typescript

#javascript #typescript

Вопрос:

Допустим, у меня есть список объектов, таких как:

 const TABS = [
  {
        name: 'Home',
        // other properties
  },
  {
        name: 'Profile',
        // other properties
  }
];
  

Как я могу определить type Tab , какой тип для поля «имя» каждого объекта в списке? В основном эквивалентно

 type Tab = 'Home' | 'Profile';
  

в приведенном выше случае (но без необходимости повторять «Home» и «Profile» в обоих определениях).

Комментарии:

1. Соответствует ли это вашим потребностям? Если это так, я напишу это как ответ. Если нет, пожалуйста, уточните.

2. Да, это идеально. Спасибо!

Ответ №1:

Это возможно до тех пор, пока значение TABS известно во время компиляции, и вы не позволяете компилятору расширять его тип до чего-то подобного Array<{name: string}> . Вы хотите, чтобы компилятор запоминал конкретные типы строковых литералов значений, которые вы вводите в name свойства, а не просто обрабатывал их как string s . Самый простой способ сделать это — использовать const утверждение для TABS литерала массива во время создания:

 const TABS = [
  {
    name: 'Home',
  },
  {
    name: 'Profile',
  }
] as const; // <-- need this 
  

Теперь компилятор знает, что TABS это пара объектов и что первый имеет name свойство типа строкового литерала "Home" , а второй имеет name свойство типа строкового литерала "Profile" .

На этом этапе вы можете просто использовать типы поиска, чтобы получить name свойство элементов с числовыми ( number ) индексами типа TABS :

 type Tab = (typeof TABS)[number]["name"];
// type Tab = "Home" | "Profile"
  

Игровая площадка ссылка на код