У меня есть такой объект:
const routes = {
home: { path: '/', page: 'home' },
profile: { path: '/profile', page: 'users/profile' }
}
Я хотел бы определить производный тип от этого, например так:
type RouteName = keyof typeof routes
, который создает тип как "home" | "profile"
.
Однако я не могу тогда сделать:
for (let name in routes) {
router.add({ name, ...routes[name]})
}
потому что компилятор жалуется на routes[name]
неявного типа any
:
Element implicitly has an 'any' type because type '{ home: { path: string; page: string; }; profile: { path: string; page: string; };' has no index signature.
Если я изменю определение маршрутов на:
interface RouteDefinition {
path: string
page: string
}
const routes: {[key: string]: RouteDefinition} = {
home: { path: '/', page: 'home' },
profile: { path: '/profile', page: 'users/profile' }
}
сгенерированный тип type RouteName = keyof typeof routes
теперь string
вместо "home"|"profile"
.
Конечно, я мог бы определить жестко RouteName
тип, но в случае, если это неясно, я стараюсь избегать определения имен маршрутов в двух местах, особенно когда ключи объекта строго определяют множество возможностей.
Объект должен быть определен только один раз и никогда не должен быть переназначен. Я пробовал кучу комбинаций Readonly<>
, кастинга и т. Д., Но не могу понять. Есть ли способ сделать это?
(я использую Typescript 2.8.1)