Присвойте каждому неизвестному свойству в интерфейсе определенный тип c и сохраните тип stati c определенных свойств. - PullRequest
0 голосов
/ 19 июня 2020

У меня есть функция, которая принимает объект option в качестве аргумента.

const newEvent = (option: Option): void => {
  // does something with the config
}

Option должен иметь несколько дополнительных и необязательных свойств.

interface Option {
  host: string;
  date: Date;
  onStart?: () => any;
  pizza?: boolean;
  ...
}

Он также должен иметь как минимум 2 дополнительных свойства, имя которых - Dynami c, а его значение соответствует форме AttendeeOption.

interface AttendeeOption {
  vip: boolean;
  allergy?: string;
  address?: string;
}

Интуитивно я попытался просто собрать их вместе:

interface Option {
  host: string;
  date: Date;
  onStart?: () => any;
  pizza?: boolean;
  [name: string]: AttendeeOption
}

Использование такой подписи индекса строки не работает, поскольку теперь все свойства должны соответствовать типу AttendeeOption.

Вторая попытка, я попытался пересечь Option и Attendee:

interface Attendee {
  [name: string]: AttendeeOption
}

const newEvent = (option: Option & Attendee): void => {
  // does something with the config
}

На данный момент ошибка интерфейса исчезла,

newEvent({
  host: 'Professor Oak',
  date: new Date(2021, 1, 3),
  'Ash': {vip: true, address: 'Pallet Town'},
  'Brock': {vip: true, address: 'Pewter City'},
  'Misty': {vip: true, address: 'Cerulean City'},
})

При тестировании я получил ошибку в свойстве Ash, Brock, May: Object literal may only specify known properties, and ''Ash'' does not exist in type 'Option'

Любая идея о том, как подойти к этому, была бы очень признательна. Спасибо!

1 Ответ

0 голосов
/ 19 июня 2020

Не знаю, хотите ли вы этого, но вы можете использовать массив AttendeeOption. Вы можете добавить имя к AttendeeOption.

  • Option Interface
  interface Option {
  host: string;
  date: Date;
  onStart?: () => any;
  pizza?: boolean;
  Attendees: AttendeeOption[]
  • Интерфейс AttendeeOption
interface AttendeeOption {
    name?: string;
  vip: boolean;
  allergy?: string;
  address?: string;
}
  • Ваш объект может быть таким
{
  host: 'Professor Oak',
    date: new Date(2021, 1, 3),
      Attendees : [
        {name: 'name1',vip: true, address: 'Cerulean City'},
        {name: 'name2',vip: true, address: 'Cerulean City'},
        {name: 'name3',vip: true, address: 'Cerulean City'}
      ]

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...