{
    "title": {
        "de-DE": "German",
        "fr-FR": "French",
        "en-CA": "English"
    },
    "image": "/tile.jpg",
    "url": "/url/to/version"
}

У меня есть этот JSON, который я запрашиваю, и моя модель выглядит так:

export class ThisIsMyModel {
    title: string;
    image: string;
    url: string;
}

Как правильно создать подполе для локалей, примерно так:

export class ThisIsMyModel {
    title: string
    [
       de-DE: string;
       fr-FR: string;
       en-CA: string;
    ];
    image: string;
    url: string;
}
1
Sharivari 13 Мар 2018 в 15:34

2 ответа

Лучший ответ

Если набор языков ограничен перечисленными вами, вы можете использовать это определение. Также, если вы просто собираетесь преобразовать объект JSON в тип модели, вам следует использовать интерфейс, а не класс:

export interface ThisIsMyModel {
    title: {
       'de-DE': string;
       'fr-FR': string;
       'en-CA': string;
    };
    image: string;
    url: string;
}

Если языки неизвестны, вы можете определить объект с помощью индексатора строк:

export interface ThisIsMyModel {
    title: {
        [name: string]: string
    };
    image: string;
    url: string;
}
2
Titian Cernicova-Dragomir 13 Мар 2018 в 12:37

Приведенное вами определение TS не будет работать с вашими данными. title может иметь тип { [key: string]: string }, если хотите. Если бы он мог также быть простой строкой, вы могли бы попробовать { [key: string]: string} | string и разобраться с тем или иным случаем во время выполнения.

0
Horia Coman 13 Мар 2018 в 12:38