У меня есть несколько объектов, которые имеют много общих свойств, но имеют небольшое подмножество, которое отличается.Они различаются по их идентификатору, который является одним значением из перечисления.Я хотел бы напечатать их как подтипы одного и того же универсального, чтобы использовать защиту типов, чтобы знать, какие свойства доступны.
Пример:
enum ItemIDs {
ITEM_TYPE_1,
ITEM_TYPE_2
}
// Generic item with shared properties
interface GenericItem<ID, Data> {
id: ID
data: Data
}
// Specific items where the 'data' property can be different shapes
type SpecificItemOne = GenericItem<ItemIDs.ITEM_TYPE_1, { content: string }>
type SpecificItemTwo = GenericItem<ItemIDs.ITEM_TYPE_2, { amount: number }>
// Specific item is a union of all specific items
type SpecificItem = SpecificItemOne | SpecificItemTwo;
// Take item and test that typescript can work out what properties are available
// It works!
const testTypeGuard = (item: SpecificItem) => {
if (item.id === ItemIDs.ITEM_TYPE_1) {
item.data.content = ''
} else if (item.id === ItemIDs.ITEM_TYPE_2) {
item.data.amount = 0;
}
return item;
}
// Try to create item where ID can be any from ID enum
const breakTypeGuard = (id: ItemIDs, data: any) => {
// Type 'ItemIDs' is not assignable to type 'ItemIDs.ITEM_TYPE_2'.
// WHY
testTypeGuard({ id, data });
}
или интерактивный насайт ts .
Кажется, он говорит, что не может присвоить все значения перечисления конкретному подтипу.Я не понимаю, почему это проблема, потому что он объединяется с другими типами, которые вместе принимают все значения перечисления.
Что я делаю не так?
Спасибо за любую помощь.