Typescript: как определить интерфейсы для вложенных объектов?

94

Предположим, у меня есть полезная нагрузка JSON, которая анализирует что-то вроде этого:

{
    name: "test",
    items: {
        "a": {
            id: 1,
            size: 10
        },
        "b": {
            id: 2,
            size: 34
        }
    }
}

Как мне настроить определение интерфейса Example, чтобы смоделировать, что значение свойства items является объектом, ключи которого являются строками, а значения определяются интерфейсом Item:

export interface Example {
    name: string;
    items: ???;

}

export interface Item {
    id: number;
    size: number;
}
бинс
источник

Ответы:

161

Typescript позволяет добавлять тип для ключей объекта, используя синтаксис [key: string].

Как указано в документации, они называются индексируемыми типами :

Индексируемые типы имеют подпись индекса, которая описывает типы, которые мы можем использовать для индексации объекта, а также соответствующие типы возвращаемых данных при индексировании.

В вашем случае вы бы использовали следующее:

export interface Item {
    id: number;
    size: number;
}

export interface Example {
    name: string;
    items: {
        [key: string]: Item
    };
}

Для справки вот ссылка на живой пример .

Джош Крозье
источник
2
Почему вы экспортируете Itemинтерфейс? Разве экспорта только Exampleинтерфейса недостаточно?
Александр Ким
2
@AlexanderKim да, если только Itemэто не полезно для другого кода, использующего эти типы.
evanrmurphy
Кто-нибудь знает, как установить ключи элементов с состоянием и получить к ним доступ?
Собака
@Dog, конечно, но это не сайт "код для меня"
Emobe
Спасибо за это. У меня возникла проблема с доступом к интерфейсу, определенному в одном файле класса, в другом классе. Я не определил интерфейс с экспортом. После добавления экспорта импорт в конец страницы позволил мне затем импортировать класс и интерфейс.
Gurnard