Typescript: определить интерфейс без специальных ключей и цепочек - PullRequest
2 голосов
/ 17 июня 2019

У меня есть такой пример данных, которые я получаю:

{
  Europe: {
    WestEurope: {
      Belgium: [French, English, Dutch]
   }
  }
}

Не уверен, как я могу создать интерфейс для такой динамической структуры, где у меня есть дерево:

Объект-> Объект (из регионов) -> Объект (из подрегионов) -> Объект (из Страны) -> ArrayOfStrings (of languages)

Я пытался так:

export interface Localisation {
    [key: string]: Localisation;
}
export interface Region {
    [key: string]: Region;
}
export interface SubRegion {
    [key: string]: SubRegion;
}
export interface Country {
    [key: string]: Country;
}
export interface Language {
    [index: number]: Array<string>;
}

но они не «связаны» -> поэтому «Локализация» не знает, что она содержит «Регионы» и т. Д. И я хочу как-то их соединить. Возможно ли это?

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Как насчет этого?

interface Country {
  [proporty: string]: string[];
}

interface SubRegion {
  [property: string]: Country;
}

interface Region {
  [property: string]: SubRegion;   
}

interface Localisation {
  [property: string]: Region;
}
0 голосов
/ 17 июня 2019

Альтернативой является не использование отдельных интерфейсов, а вложение всего в один интерфейс. Это работает, только если вам не нужны отдельные типы.

interface Localization {
    [region: string]: {
        [subregion: string]: {
            [country: string]: string[]
        }
    }
}


// Usage

const data: Localization = {
    Europe: {
        WestEurope: {
            Belgium: ['French', 'English', 'Dutch']
        }
    }
};

const westEurope = data['Europe']['WestEurope']; // Is of type { [country: string]: string[] }

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