#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"