Чтобы узнать, какой тип передал пользователь, вам нужно использовать различимые союзы .
. Для этого вам необходимо:
- Дополнить интерфейсы, добавляющие свойство
kind
или type
или что угодно, чтобы различать их:
interface Recipe {
type: 'Recipe',
title: string,
ingredients: []
creator: string,
// ...
}
interface Vendor {
type: 'Vendor',
name: string
address: Address
// ...
}
Определение типа объединения, включая доступные объекты
type Entity /* or whatever */ = Recipe | Vendor;
Теперь TS может понять, какой именно интерфейс c используется, учитывая свойство типа
Определить Событие по типу объединения
interface Event<T extends Entity> {
date: Date,
type: T['type'], // If you need only the type
object?: T
}
const event: Event<Recipe> = {
date: Date,
type: 'recipe',
object: recipe
}
function <T extends Entity>(event: Event<T>) {
switch (event.type) {
// ...
}
}