Скажите, у меня есть два следующих типа:
export type CollectionNames = 'twitter:tweets' | 'twitter:users' | 'twitter:metadata-cashtag'
export type CollectionType<T extends CollectionNames> =
T extends 'twitter:tweets' ? Tweet :
T extends 'twitter:users' ? User :
T extends 'twitter:metadata-cashtag' ? CashtagMetadataDb :
never
Я чувствую, что это очень неуклюже, и я не очень хочу иметь струны дважды. Также возможно юридически неправильно их напечатать в последнем типе.
Есть ли способ создать их динамически из такого объекта, как этот:
typings = {
'twitter:tweets': Tweet,
'twitter:users': User,
'twitters:metadata-cashtag': CashtagMetadataDb
}
Идея состоит в том, что несколько модулей будут иметь свой собственный тип CollectionType
, который затем агрегируется в один CollectionType
в корневом импортирующем модуле. Поэтому, если у меня есть два модуля Coin
и Twitter
, импортированные с использованием * as
, это выглядит примерно так:
type CollectionName = Twitter.CollectionNames | Coin.CollectionNames
type CollectionType<T extends CollectionName> =
T extends Twitter.CollectionNames ? Twitter.CollectionType<T> :
T extends Coin.CollectionNames ? Coin.CollectionType<T> :
never
Затем они будут использоваться в функции, подобной той, где типы относятся к последнему типу (Collection
здесь из MongoDB):
async function getCollection<T extends CollectionName> (name: T): Promise<Collection<CollectionType<T>>>