машинописный интерфейс с параметром объекта generi c - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть несколько объектов в моем приложении. Например:

interface Recipe {  
  title: string,  
  ingredients: []  
  creator: string,  
  // ...  
}

interface Vendor {  
  name: string
  address: Address  
  // ...  
}

Пользователь должен иметь возможность создавать объекты, которые могут принимать любой из этих интерфейсов, например:

interface Event<T> {  
  date: Date(),  
  type: T // This should be of type Recipe or Vendor object for example.  
}
  1. Как правильно определить это?
  2. Как мне узнать, какой объект передал пользователь?

Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2020

Чтобы узнать, какой тип передал пользователь, вам нужно использовать различимые союзы .

. Для этого вам необходимо:

  1. Дополнить интерфейсы, добавляющие свойство 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) {
    // ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...