Типографское определение интерфейса динамическое - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь определить интерфейс для следующих данных:

result =
{
   "data1" : [ { "type1" : 30 }, { "type2" :40 } ],
   "data1" : [ { "abc" : 40 }, { "def" 940 } ],
   "data3" : []
}

здесь ключи и значения внутри объекта result являются динамическими c. Даже значения внутри массива объектов являются динамическими c, но они будут иметь формат string: number или этот массив может быть пустым, как в data3.

Я пробовал использовать [x:any]: any, но похоже он удалит значение остальных типов, определенных в интерфейсе, поскольку он будет соответствовать всему.

Может ли кто-нибудь помочь мне здесь?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Что-то подобное вы можете сделать ->

Вам не нужно использовать индексатор (поскольку он немного менее безопасен). У вас есть два варианта:

interface EnumServiceItem {
   id: int; label: string; key: any
}

interface EnumServiceItems extends Array<EnumServiceItem>{}


// Option A 
var result: EnumServiceItem[] = [
 { id: 0, label: 'CId', key: 'contentId' },
 { id: 1, label: 'Modified By', key: 'modifiedBy' },
 { id: 2, label: 'Modified Date', key: 'modified' },
 { id: 3, label: 'Status', key: 'contentStatusId' },
 { id: 4, label: 'Status > Type', key: ['contentStatusId', 'contentTypeId'] },
 { id: 5, label: 'Title', key: 'title' },
 { id: 6, label: 'Type', key: 'contentTypeId' },
 { id: 7, label: 'Type > Status', key: ['contentTypeId', 'contentStatusId'] }
];


// Option B
var result: EnumServiceItems = [
 { id: 0, label: 'CId', key: 'contentId' },
 { id: 1, label: 'Modified By', key: 'modifiedBy' },
 { id: 2, label: 'Modified Date', key: 'modified' },
 { id: 3, label: 'Status', key: 'contentStatusId' },
 { id: 4, label: 'Status > Type', key: ['contentStatusId', 'contentTypeId'] },
 { id: 5, label: 'Title', key: 'title' },
 { id: 6, label: 'Type', key: 'contentTypeId' },
 { id: 7, label: 'Type > Status', key: ['contentTypeId', 'contentStatusId'] }
 ]

Лично я рекомендую вариант A (более простая миграция, когда вы используете классы, а не интерфейсы).

0 голосов
/ 04 августа 2020

Вы можете определить динамический c ключевой интерфейс следующим образом:

interface Result {
  [key: string]: {
    [childKey: string]: number;
  }[];
}
...